2011-06-03 198 views
1

我有下面的XML:获取节点值第一个节点

<?xml version='1.0' ?> 
<foo>A&gt;B</foo> 

,只是想开始标记的节点值A&gt;B,如果我们使用getNodeValue将其转换为A> B这是不需要的。

因此,我决定用变压器

 Document doc = getParsedDoc(abovexml); 
     TransformerFactory tranFact = TransformerFactory.newInstance(); 
     Transformer transfor = tranFact.newTransformer(); 
     transfor.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     Source src = new DOMSource(node); 
     StringWriter buffer = new StringWriter(); 
     Result dest = new StreamResult(buffer); 
     transfor.transform(src, dest); 
     String result = buffer.toString(); 

但是,这提供了以下输出结果的一部分作为<foo>A&gt;B</foo>

这将是有益的,如果有人能澄清,如果有与做法(<foo>A&gt;B</foo>

+1

请添加标签以识别您正在使用的语言和平台。 – Oded 2011-06-03 16:39:59

+1

定义了哪个节点? – 2011-06-03 16:49:47

回答

0

因为getNodeValue()会自动解码字符串,所以我们可以得到A&gt;B
您可以使用Apache Commons Lang中的StringEscapeUtils再次对其进行编码。

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringEscapeUtils.html
http://commons.apache.org/lang/

String nodeValue = StringEscapeUtils.escapeHtml(getNodeValue()); 

这将编码成格式,你希望它是。 因为你是为每个节点的值将编码这不是很友好的表现。

+0

实际上,'getNodeValue()'不解码字符串。该字符串在解析时被解码。在信息模型中,假设它是如何存储在内存中的,字符串**是**'A> B',而不是'A > B'。后者只是一个序列化表单。 'getNodeValue()'返回实际的字符串,'A> B'。但是,这里给出的解决方案是正确的:如果你想要一个转义表单('A > B'),你需要询问它,使用转义工具。 – LarsH 2012-02-15 15:56:42

0

其实getNodeValue()不是“转换”字符串。 从文件中解析XML或通过转换生成XML时,得到的信息模型是字符串A>B而不是A&gt;B。后者只是一个序列化表单。

另一种合法的序列化格式是A>B(因为right angle bracket does not need to be escaped in most cases)。但是,如果想要生成A&gt;B,可能会有兼容性原因,特别是如果您的输出旨在为HTML(尽管您没有提及)。

如果您有充分的理由逃避>,那么我同意@kensen john的回答。