在XML文档中,是否可以区分实体编码字符与非实体编码字符之间的区别?

时间:2015-11-24 18:00:35

标签: java xml encoding dom4j

我正在使用有关我需要解析的在线资源的元数据来提供XML文档。在不同的元数据项中有一组标记,这些标记以逗号分隔。这是一个例子:

<tags>Research skills, Searching&#44; evaluating and referencing</tags>

问题在于其中一个&#34;标签&#34;包含一个逗号。标记中的逗号是编码的,但是用于分隔标记的逗号不是。我(目前)正在使用getText() method on org.dom4j.Node来读取<tags>元素的文本内容,该元素返回一个字符串。

问题是我无法 - 据我所知 - 在我收到的字符串中区分编码的逗号(与未编码的逗号)。

如果没有编写我自己的XML解析器,是否有另一种方法可以在更多&#34; raw&#34;中访问该节点的文本内容。州? (即编码的逗号仍然编码的状态。)

3 个答案:

答案 0 :(得分:1)

使用dom4j或DOM时,所有实体都已解析,因此您需要返回解析步骤来捕获字符引用。

SAX是一个更低级别的接口,并且通过其LexicalHandler接口支持在解析器遇到实体引用时得到通知,但它不报告字符引用。所以看起来你真的需要编写一个自己的解析器,或修补现有的解析器。

但最终,如果您可以更改文档的架构,那将是最好的:

<tags>
    <tag>Research skills</tag>
    <tag>Searching, evaluating and referencing</tag>
</tags>

在当前文档中,字符引用用作元数据。 XML元素是表达它的更好方式。

答案 1 :(得分:1)

使用http://andrewjwelch.com/lexev/中的LexEv,在类路径上放置来自Apache Xerces的xercesImpl.jar,我可以使用dom4j编译并运行一些简短的示例:

    LexEv lexEv = new LexEv();

    SAXReader reader = new SAXReader(lexEv);

    Document doc = reader.read("input1.xml");

    System.out.println(doc.getRootElement().asXML());

如果input1.xml包含示例XML片段,则输出为

<tags xmlns:lexev="http://andrewjwelch.com/lexev">Research skills, Searching<lexev:char-ref name="#44">,</lexev:char-ref> evaluating and referencing</tags>

这样,您就可以获得输入的表示,其中可以区分纯字符和字符引用。

答案 2 :(得分:0)

据我所知,每个XML处理框架(vtd-xml除外)在解析过程中解析实体....

您只能使用VTDNav的toRawString()方法使用vtd-xml来区分字符与其实体编码的对应字符...