2011-06-03 166 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的回答。