使用 SAX 读取 XML,跳过传递 org.xml.sax.SAXParseException 的节点

Posted

技术标签:

【中文标题】使用 SAX 读取 XML,跳过传递 org.xml.sax.SAXParseException 的节点【英文标题】:Reading an XML with SAX, skipping the nodes that passes org.xml.sax.SAXParseException 【发布时间】:2012-01-03 14:52:36 【问题描述】:

我正在使用 SAX (javax.xml.parsers.SAXParser;) 读取 XML。在该 XML 中,子节点值中有一些特殊字符,如 (&,,",')。因此,到目前为止,SAX 已成功读取 XML,但此时它会抛出 org.xml.sax.SAXParseException

例如,在下面的示例 XML 中,SAX 最多读取成功的节点值。但它会抛出这个org.xml.sax.SAXParseException,因为 Name 参数的值有

<Parent>
   <child1>
      LS-23541723
   </child1>
   <child2 id="2" Name="T-Shirt And Denim - T<D" Rate="500.00">
   </child2>
   <child3>
      <![CDATA[This is the child 2]]>
   </child3>
   <child4>
      <![CDATA[This is the child 4]]>
   </child4>
</Parent>

我无法事先确定包含这些特殊字符的节点。(它是动态的。)所以,我想做的是,用 SAX 读取 XML,忽略包含这些特殊字符的节点。简单,如果可以使用 SAX 读取 XML,我想我可以这样做,跳过传递 org.xml.sax.SAXParseException 的节点。

这可能吗?如果可以,怎么做?

注意:我不能简单地将它们替换为 &amp;amp; 之类的实体引用,因为有时 XML 节点也会与 &amp;lt;&amp;gt; 一起使用(以 &amp;lt;child1&amp;gt; 的形式出现)。因此,在开始使用 SAX 阅读之前,我将所有实体引用替换为字符引用。(replaceAll("&amp;gt;","&gt;") 等)

【问题讨论】:

【参考方案1】:

我不认为 SAX 可以处理这个问题。 XML 必须格式正确。因此,在将文本提交给 SAX 之前,您必须进行大量替换。查找任何不在正确位置的'"&amp;lt;"" 之间,''&amp;lt; 之间,它不是开始标签或结束标签的一部分。这应该是可行的。这是您第一次通过后的第二次通过,将&amp;lt;&amp;gt; 替换为等效的对应项。 理想情况下,您还应该注意 cmets、CDATA 部分等...以确保它们格式正确。

【讨论】:

谢谢Ikuty,其实我现在也得出了这个结论。

以上是关于使用 SAX 读取 XML,跳过传递 org.xml.sax.SAXParseException 的节点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中使用 DOM 或 SAX 解析器从 XML 读取子节点

Java web——xml文件读取的解析方式(DOM和SAX)

Sax,Dom,Full解析xml文件

如何使用 Open XML 和 SAX 以编程方式检测空行?

XML

DOM、SAX 和 StAX XML 解析器之间有啥区别? [关闭]