使用 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;
之类的实体引用,因为有时 XML 节点也会与 &lt;
、&gt;
一起使用(以 &lt;child1&gt;
的形式出现)。因此,在开始使用 SAX 阅读之前,我将所有实体引用替换为字符引用。(replaceAll("&gt;",">"
) 等)
【问题讨论】:
【参考方案1】:我不认为 SAX 可以处理这个问题。 XML 必须格式正确。因此,在将文本提交给 SAX 之前,您必须进行大量替换。查找任何不在正确位置的'
、"
或&lt;
。 "
在"
之间,'
在'
和&lt;
之间,它不是开始标签或结束标签的一部分。这应该是可行的。这是您第一次通过后的第二次通过,将&lt;
和&gt;
替换为等效的对应项。
理想情况下,您还应该注意 cmets、CDATA 部分等...以确保它们格式正确。
【讨论】:
谢谢Ikuty,其实我现在也得出了这个结论。以上是关于使用 SAX 读取 XML,跳过传递 org.xml.sax.SAXParseException 的节点的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 中使用 DOM 或 SAX 解析器从 XML 读取子节点
Java web——xml文件读取的解析方式(DOM和SAX)