Java 'getLocalName ()' возвращает ноль, даже если 'setNamespaceAware (true)' - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть следующий пример 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 голосов
/ 24 декабря 2018

Документация для getLocalName () гласит:

Для узлов любого типа, кроме ELEMENT_NODE и ATTRIBUTE_NODE, и узлов, созданных методом DOM уровня 1,например, Document.createElement(), это всегда null.

И документация для setAttribute гласит:

Чтобы установить атрибут сполное имя и URI пространства имен, используйте метод setAttributeNS.

Таким образом, установка значения атрибута не приведет к установке локального имени, если вы явно не установите атрибут пространства имен с помощью setAttributeNS :

root.setAttributeNS(null, "attr2", "value2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...