使用DocumentBuilderFactory将DOM文档转换为DOM对象

时间:2010-08-04 09:55:09

标签: java xml dom parsing

我目前正在修改一段代码,我想知道XML格式化的方式(制表符和间距)是否会影响它被解析为DocumentBuilderFactory类的方式。

本质上问题是......我可以将没有间距的大字符串传递给DocumentBuilderFactory,还是需要以某种方式进行格式化?

先谢谢,下面是Oracles网站的课程定义。

类DocumentBuilderFactory

“定义一个工厂API,使应用程序能够从XML文档中获取生成DOM对象树的解析器。”

4 个答案:

答案 0 :(得分:3)

文件会有所不同。选项卡和新行将转换为文本节点。您可以在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);
        }
    }
}

答案 1 :(得分:1)

只要字符串是有效 XML,它就不应该影响解析器的能力。标签和换行符被解析器删除或忽略,实际上是为了人类读者的美学。

请注意,您必须将输入流(例如StringBufferInputStream)传递给DocumentBuilder,因为parse的字符串版本假定它是XML的URI。

答案 2 :(得分:1)

DocumentBuilder为xml字符串构建不同的DOM对象,其中包含换行符和不带换行符的xml字符串。这是我测试的代码:

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对象是不同的。

答案 3 :(得分:0)

对XML-String的格式应该没有任何影响,但我记得一个奇怪的问题,因为我将一个长字符串传递给XML解析器。 paser无法解析XML文件,因为它是在一条长行中编写的。

如果插入换行符,这些行不会长于1000字节,可能会更好。

但遗憾的是,我确实记得为什么会发生错误,也不知道我采取了哪种解析器。