从xml文档中删除具有无效标记名称的节点

时间:2012-04-25 12:02:58

标签: java xml saxon

我使用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的整行。

通过一些精神上的弯曲,我可以想出一个正则表达式来识别无效的字符串,但是很难删除包含属性和子节点的节点。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如果输入包含无效标记,那么它不是XML。通过将这些文档称为非XML文档而不是XML文档,最好让您的思维方式正确;这有助于明确表示要处理非XML文档,您需要非XML工具。 (忘记“节点” - 在解析文档之前没有节点,并且在将其转换为格式良好的XML之前无法对其进行解析)。要将非XML转换为XML,您通常需要使用擅长文本操作的非XML工具,例如Perl。当然,从源头解决问题要好得多:如果人们以私有非XML格式生成数据,那么XML的所有好处都会丢失。