【问题标题】:why Attribute count is 0 for this XML Tag为什么此 XML 标记的属性计数为 0
【发布时间】:2011-11-15 13:05:30
【问题描述】:

我正在使用 STAX Parser 来解析 XML 文档。 我在下面有这个标签

<bustxml><![CDATA[&lt;bustxml xmlns=\"http://www.bustprotocol.org/bustxml-5-0-SP2\"&gt;&lt;NewOrdMBag TmInForce=\"0\" OrdTyp=\"1\" Acct=\"1234\"&gt;&lt;Ord OrdQty=\"1\" </bustxml>

我需要读取上面标签的属性,所以我使用了

 case XMLStreamConstants.START_ELEMENT:
                 for(int i = 0, n = reader.getAttributeCount(); i < n; ++i)
                  System.out.println("Attribute: " + reader.getAttributeName(i) 
                             + "" + reader.getAttributeValue(i));

但不幸的是,我得到了,属性计数为 0。 请告诉我如何读取 bustxml 标签内的所有内容

【问题讨论】:

  • 在您的示例中仅供参考,您打开 CDATA 部分而不关闭它
  • 嗨,贾斯汀,为了安全起见,我没有发布整个 XML。所以我想这不是问题。

标签: xml dom xml-parsing sax stax


【解决方案1】:

bustxml 元素没有属性,如果有,它看起来像这样:

<bustxml MyAttribute="MyValue">
<!-- Content -->
</bustxml>

如果您想读取bustxml 元素的内容,那么您应该使用getElementText

更新:如果您谈论的是 CDATA 部分中包含的编码 xml 片段中的 bustxml 元素,那么您需要提取此 CDATA 片段的文本,然后从取而代之。

【讨论】:

  • 谢谢,我应该在哪里使用这个 getElementText 或 getText ?因为 reader.getAttributeCount();现在是 0 ,(根据属性计数)
  • @yyyi777 我相信你应该使用getElementText 但是我不是 100% 确定(我通常是 C# 开发人员)
  • 我尝试使用 bustxml = reader.getName().toString() 提取 CData 的内容;但是我们仍然如何从中获取属性计数??
【解决方案2】:

CDATA 外的 bustxml 元素没有属性。

CDATA 中的 bustxml 不是标签。这就是 CDATA 的意思:“这是字符数据。不要将您在此处找到的任何内容视为标记。”所以内容可能看起来像一个标签,但它不是标签,因为 CDATA,因此它没有属性。

不幸的是,人们将 XML 封装在 CDATA 中是很常见的。他们这样做是为了让你的生活变得困难。 (好吧,我想这就是原因,我想不出其他任何原因。)发生这种情况时,您唯一的补救措施是提取 CDATA 中的文本并将其提交给 XML(或 HTML)解析器以将其转换为树,然后就可以正常访问元素和属性了。

在您的情况下,他们不仅将其包装在 CDATA 中,而且还将其转义,从而使其变得更加困难。所以他们有效地对它进行了双重转义,所以你必须将它通过解析器两次(除了原始解析之外)才能理解它。

我会非常大声地向那些给你发这些垃圾的人抱怨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多