簡體   English   中英

使用DocumentBuilderFactory將XML文檔轉換為DOM對象

[英]Xml document to DOM object using DocumentBuilderFactory

我當前正在修改一段代碼,並且想知道XML的格式化方式(制表符和間距)是否會影響將其解析為DocumentBuilderFactory類的方式。

本質上,問題是...我可以將沒有間隔的大長字符串傳遞給DocumentBuilderFactory還是需要以某種方式對其進行格式化?

預先感謝,下面是Oracle網站上的類定義。

類DocumentBuilderFactory

“定義一個工廠API,使應用程序能夠獲得一個解析器,該解析器可以從XML文檔生成DOM對象樹。”

文件會有所不同。 制表符和換行符將轉換為文本節點。 您可以使用DocumentBuilderFactory上的以下方法消除它們:

但是為了使其工作,您必須設置DOM解析器以根據DTD或xml模式驗證內容。

或者,您可以使用類似以下的方法自己以編程方式刪除多余的空格:

public static void removeEmptyTextNodes(Node node) {
    NodeList nodeList = node.getChildNodes();
    Node childNode;
    for (int x = nodeList.getLength() - 1; x >= 0; x--) {
        childNode = nodeList.item(x);
        if (childNode.getNodeType() == Node.TEXT_NODE) {
            if (childNode.getNodeValue().trim().equals("")) {
                node.removeChild(childNode);
            }
        } else if (childNode.getNodeType() == Node.ELEMENT_NODE) {
            removeEmptyTextNodes(childNode);
        }
    }
}

只要字符串是有效的 XML,它就不會影響解析器的功能。 制表符和換行符被語法分析器剝離或忽略,實際上是為了使人類閱讀者美觀。

請注意,您必須將輸入流 (例如StringBufferInputStream)傳遞給DocumentBuilder,因為解析的字符串版本假定它是XML的URI。

DocumentBuilder為帶換行的xml字符串和不帶換行的xml字符串構建不同的DOM對象。 這是我測試過的代碼:

StringBuilder sb = new StringBuilder();
sb.append("<root>").append(newlineChar).append("<A>").append("</A>").append(newlineChar).append("<B>tagB").append("</B>").append("</root>");

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

InputStream    xmlInput = new ByteArrayInputStream(sb.toString().getBytes());
Element documentRoot = builder.parse(xmlInput).getDocumentElement();

NodeList nodes = documentRoot.getChildNodes();

System.out.println("How many children does the root have? => "nodes.getLength());

for(int index = 0; index < nodes.getLength(); index++){
    System.out.println(nodes.item(index).getLocalName());
}

輸出:
How many children does the root have? => 4
null
A
null
B

但是,如果從StringBuilder中刪除了新的newlineChar ,則輸出為:
How many children does the root have? => 2
A
B

這表明DocumentBuilder生成的DOM對象是不同的。

關於XML-String的格式應該沒有任何影響,但是當我將一個長字符串傳遞給XML解析器時,我可以記住一個奇怪的問題。 由於它是一長行編寫的,因此paser無法解析XML文件。

如果您以這種方式插入換行符,則行的長度最好不超過1000個字節,這可能會更好。

但是可悲的是,我確實清楚地記得為什么會發生該錯誤,也不知道我使用了哪個解析器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM