Java'getLocalName()'即使使用'setNamespaceAware(true)'也返回null

时间:2018-12-24 12:57:55

标签: java xml xml-parsing

我有以下示例XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<root attr1="value1"/>

以下Java示例演示了我面临的问题:

import java.io.FileInputStream;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;

public class XMLClass {

public static void main(String[] args) throws Exception {
    // path to xml file
    String filename = "src/resources/xmlfile.xml";

    DocumentBuilderFactory db = DocumentBuilderFactory.newInstance();

    // this only helps for attr1 but not attr2
    db.setNamespaceAware(true);

    InputStream input = new FileInputStream(filename);
    Document doc = db.newDocumentBuilder()
            .parse(input);

    Element root = doc.getDocumentElement();

    // create an additional attribute
    root.setAttribute("attr2", "value2");

    NamedNodeMap nnm = root.getAttributes();

    // The attribute name and value is correct
    // for the attr1, however, the name for
    // attr2 is null
    for (int i = 0; i < nnm.getLength(); i++) {
        Attr a = (Attr) nnm.item(i);
        String name = a.getLocalName();
        String value = a.getValue();

        System.out.println("name: " + name + "; value: " + value);
    }

    System.exit(0);
}


}

输出为:

name: attr1; value: value1
name: null; value: value2

我已经在网上搜索过,发现的唯一建议就是使用setNamespaceAware(true),就像我在代码中所做的那样。这样可以确保attr1正确返回XML文件中定义的getLocalName()的属性名称。但是,虽然可以正确检索值,但通过attr2在代码中设置的属性名称setAttribute()为空。

此行为的原因是什么,什么是解决我的问题的正确方法?

1 个答案:

答案 0 :(得分:2)

getLocalName()的文档说:

  

对于ELEMENT_NODEATTRIBUTE_NODE以外的任何类型的节点以及使用DOM Level 1方法创建的节点,例如Document.createElement(),该节点始终为null

setAttribute的文档中说:

  

要使用限定名称和名称空间URI设置属性,请使用setAttributeNS方法。

因此,除非使用setAttributeNS显式设置命名空间的属性,否则设置属性值将不会设置本地名称:

root.setAttributeNS(null, "attr2", "value2");