Java 在XML文档中,是否可以区分实体编码字符和非实体编码字符之间的区别?
我正在向一个XML文档提供有关需要解析的在线资源的元数据。在不同的元数据项中,有一组以逗号分隔的标记。以下是一个例子:Java 在XML文档中,是否可以区分实体编码字符和非实体编码字符之间的区别?,java,xml,encoding,dom4j,Java,Xml,Encoding,Dom4j,我正在向一个XML文档提供有关需要解析的在线资源的元数据。在不同的元数据项中,有一组以逗号分隔的标记。以下是一个例子: <tags>Research skills, Searching, evaluating and referencing</tags> 研究技能,搜索和#44;评估和参考 问题是其中一个“标记”中包含逗号。标记中的逗号已编码,但用于分隔标记的逗号未编码。我(目前)正在使用读取元素的文本内容,该元素返回一个字符串 问题是,据我所知,我无
<tags>Research skills, Searching, evaluating and referencing</tags>
研究技能,搜索和#44;评估和参考
问题是其中一个“标记”中包含逗号。标记中的逗号已编码,但用于分隔标记的逗号未编码。我(目前)正在使用读取
元素的文本内容,该元素返回一个字符串
问题是,据我所知,我无法区分收到的字符串中编码的逗号(与未编码的逗号)
除了编写我自己的XML解析器之外,还有其他方法可以以更“原始”的状态访问此节点的文本内容吗?(即编码的逗号仍被编码的状态。)使用dom4j或DOM时,所有实体都已解析,因此需要返回到解析步骤以捕获字符引用 SAX是一个较低级别的接口,它支持通过其LexicalHandler接口在解析器遇到实体引用时获得通知,但它不报告字符引用。因此,您似乎真的需要编写自己的解析器,或者修补现有的解析器 但最终,如果您可以更改文档的架构,那将是最好的:
<tags>
<tag>Research skills</tag>
<tag>Searching, evaluating and referencing</tag>
</tags>
研究技能
搜索、评估和参考
在当前文档中,字符引用用作元数据。XML元素是一种更好的表达方式。使用来自的
LexEv
,将来自ApacheXerces的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>
研究技能、搜索、评估和参考
这样,您就可以获得输入的表示形式,其中可以区分纯字符和字符引用。据我所知,每个XML处理框架(除了)在解析过程中解析实体
通过使用VTDNav的toRawString()方法,您只能使用vtd xml将字符与其实体编码的对应字符区分开来…我同意--文档中此信息的表示形式需要更改。就像经常发生的那样,我要求改变已经有一段时间了。。。到目前为止,还没有实现。在设计信息的XML表示时犯了很多错误,但我必须说,这是我第一次看到有人试图将文字字符与其十六进制代码之间的差异作为语义上的重要区别。这个问题也发生在XSLT处理的上下文中,在那里,您可以使用Andrew Welch的
LexEv
()来代替普通的XMLReader
,它将词汇事件(包括字符引用)分别转换为标记节点(例如,字符引用 ;
报告为
)。您可能想试试它是否可以与DOM API一起使用。@Martin,您确定LexEv会报告字符引用吗?我认为这些信息在SAX级别上是不可用的。我知道它报告解析的实体引用,但那是另一回事。当我写我的评论时,我依赖于文档,但我现在尝试在问题中的上述示例上运行Saxon 9、LexEx和身份转换,它将根元素输出为Research skills、Searching、,计算和引用
,因此,是的,它能够识别字符引用,即使正常SAX事件没有覆盖字符引用。我还需要将xercesImpl.jar
放在类路径上。