我有以下示例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()
为空。
此行为的原因是什么,什么是解决我的问题的正确方法?
答案 0 :(得分:2)
getLocalName()的文档说:
对于
ELEMENT_NODE
和ATTRIBUTE_NODE
以外的任何类型的节点以及使用DOM Level 1方法创建的节点,例如Document.createElement()
,该节点始终为null
。
setAttribute的文档中说:
要使用限定名称和名称空间URI设置属性,请使用
setAttributeNS
方法。
因此,除非使用setAttributeNS显式设置命名空间的属性,否则设置属性值将不会设置本地名称:
root.setAttributeNS(null, "attr2", "value2");