У меня есть следующий пример 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()
, равно нулю, хотя значение правильно получено.
В чем причина такого поведения и как правильно решить эту проблему?моя проблема?