![](/img/trans.png)
[英]Transformer.transform() writes the first tag on the same line as <?xml>
[英]Prevent transformer.transform( source, result ) from escaping special character
我正在使用 DOM 解析器更新 xml 的節點和文本內容。 為了保存那個 DOM 解析器,我使用了 Transformer.transform 方法。 下面是示例代碼。
String xmlText = "<uc>abcd><name>mine</name>efgh\netg<tag>sd</tag></uc>";
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
InputSource inStream = new InputSource();
inStream.setCharacterStream(new StringReader(xmlText));
Document document = documentBuilder.parse(inStream);
Node node = document.getDocumentElement();
node.normalize();
NodeList childNodes = node.getChildNodes();
for(int i=0; i<childNodes.getLength(); i++) {
if(childNodes.item(i).getNodeType() == Node.TEXT_NODE) {
System.out.println(childNodes.item(i).getTextContent());
childNodes.item(i).setTextContent("123>");
}
}
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "US-ASCII");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource( document );
OutputStream xml = new ByteArrayOutputStream();
StreamResult result = new StreamResult( xml );
transformer.transform( source, result );
String formattedXml = xml.toString();
System.out.println(formattedXml);
由於我更新的文檔有像“>”這樣的文本內容,transformer.transform 方法將其更改為 &g t; 有沒有辦法在不轉義特殊字符的情況下獲得輸出。 由於某些項目限制,我無法使用其他解析器。 我不能使用 StringEscapeUtils.unescapeXml()。 原因是 xml 可以有 &g t;。 如果我使用這種實用方法,&g t; 最初存在於 xml 中的內容也將被更改。 所以我想要一種不會逃避任何特殊字符的機制。
您創建的變壓器
Transformer transformer = tFactory.newTransformer();
使用實現身份轉換的默認樣式表進行初始化。 這意味着它將簡單地將您的 DOM 序列化為格式良好的 XML 文檔。 必要時自動應用輸出轉義。
如果您想要更好地控制輸出,並且可能生成不符合 XML 文檔結構的內容,您可以使用將輸出方法切換為文本的自定義樣式表。 通過這種方式,您可以控制更多的結構,但可能會在 XML 區域中犯更多錯誤。
更多信息請訪問
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.