Java:在解析XML时忽略转义字符

4
我正在使用DocumentBuilder来解析XML文件。然而,项目规范要求在文本节点中,像&quot;&lt;这样的字符串应该按照字面意思返回,而不是作为字符("<)进行解码。

之前有一个类似的问题Read escaped quote as escaped quote from xml,其中一个答案似乎只适用于Apache,另一个则根本没有做到它所说的功能。但我很乐意被证明是错误的 :)。
以下是一些代码供参考:
  file = new File(fileName);
  DocBderFac = DocumentBuilderFactory.newInstance();
  DocBder = DocBderFac.newDocumentBuilder();
  doc = DocBder.parse(file);

  NodeList textElmntLst = doc.getElementsByTagName(text);
  Element textElmnt = (Element) textElmntLst.item(0);

  NodeList txts = textElmnt.getChildNodes(); 
  String txt = ((Node) txts.item(0)).getNodeValue();
  System.out.println(txt);

我希望println()会产生类似以下内容的输出:
&quot;3&gt;2&quot;

代替
"3>2"

这就是目前发生的情况。谢谢!


你能澄清一下你想要什么吗?你想要打印转义版本,还是想让它取决于XML中的呈现方式? - Yishai
Yishai:任何一种都有帮助,因为我认为文件中可能从来没有文字引号、大于号等。但是,我不能确定,如果有的话,我会想要保留它们。 - Personman
在 XML 中,未引用的字符(如 >)不是非法的吗?永远不会有一个字面上的 >。 - DJClayworth
2
@DJClayworth:未引用的字符,如>在CDATA节中是合法的。 - Don Roby
4个回答

3
您可以通过以下方式将它们转换回xml编码形式:
 StringEscapeUtils.escapeXml(str);

(javadoc, commons-lang)


2
我正在使用DocumentBuilder来解析XML文件。然而,该项目的规范要求在文本节点中返回像&quot;&lt;这样的字符串,而不是将它们解码为字符("和<)。
这是一个糟糕的要求,请不要这样做。
或者至少仔细考虑您为什么认为需要这样做。
CDATA节和转义是一种策略,允许您通过XML传递像引号和'<'字符这样的文本,而不会被XML与标记混淆。它们本身没有意义,当您从XML中提取它们时,应该接受它们作为它们所代表的引号和'<'字符。

1

一种方法可能是尝试使用dom4j,并使用Node.asXML()方法。它可能会返回一个深层结构,因此可能需要克隆才能获取您想要的节点或文本,而不包括其任何子元素。


-3

两个答案都不错,但对于这个非常小的应用程序来说都有点过重了。最终我选择了一种非常简单的方法,就是剥离所有的&符号(我之后也会这样做那些不属于转义的&符号)。虽然很丑陋,但它能够工作。

编辑:我知道这样做有很多问题,而且这个要求很愚蠢。这是一个学校项目,唯一重要的是它在一个案例中能够工作,而这个要求不是我的错 :)


1
它会在某个时候停止工作,然后你会想知道它是从哪里来的 ;) - Bozho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接