我使用Saxon XSLT2处理器(使用Java + Saxon S9API)转换xml并且必须处理xml文档作为源,它包含无效字符作为标记名称,因此无法由文档构建器解析
示例:
<A>
<B />
<C>
<D />
</C>
<E!_RANDOM_ />
< />
</A>
代码:
import net.sf.saxon.s9api.*;
[...]
/* XSLT Processor & Compiler */
proc = new Processor(false);
/* build document from input*/
XdmNode source = proc.newDocumentBuilder().build(new StreamSource(input));
错误:
Error on line X column Y
SXXP0003: Error reported by XML parser: Element type
"E" must be followed by either attribute specifications, ">" or "/>".
感叹号和标记名称 space 目前是我唯一无效的标记。 我正在寻找一个更强大的解决方案,而不仅仅是删除(格式化的)xml的整行。
通过一些精神上的弯曲,我可以想出一个正则表达式来识别无效的字符串,但是很难删除包含属性和子节点的节点。
感谢您的帮助!
答案 0 :(得分:2)
如果输入包含无效标记,那么它不是XML。通过将这些文档称为非XML文档而不是XML文档,最好让您的思维方式正确;这有助于明确表示要处理非XML文档,您需要非XML工具。 (忘记“节点” - 在解析文档之前没有节点,并且在将其转换为格式良好的XML之前无法对其进行解析)。要将非XML转换为XML,您通常需要使用擅长文本操作的非XML工具,例如Perl。当然,从源头解决问题要好得多:如果人们以私有非XML格式生成数据,那么XML的所有好处都会丢失。