首页 > 解决方案 > Java xml 解析 getElementById 返回 null

问题描述

因此,由于某种原因,在 java 中解析 XML 时,我无法getElementById("ID_VALUE")在 android 中正常工作,但不能在常规 java 中正常工作。当我尝试解析 XML 时,我只得到元素的 null 。我已经看到了一些关于可能使用模式的想法,但是我不知道该怎么做。

爪哇

public void getFromID()throws Exception {
    File file = new File("/home/nodes.xml");

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    //factory.setValidating(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(file);

    //document.getDocumentElement().normalize();

    System.out.println(id);

    Element element = document.getElementById(id);

    System.out.println(element);

    //Element element = (Element) document.getElementsByTagName("node").item(0);

    //System.out.println(element.getNodeValue());
    this.address = element.getAttribute("address");
    this.port = Integer.parseInt(element.getAttribute("port"));
    this.base64Key = element.getAttribute("key");

    System.out.println(address);
    System.out.println(port);
    System.out.println(base64Key);
}

public void save()throws Exception {
    File file = new File("/home/nodes.xml");

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    //factory.setValidating(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.newDocument();

    Element root = document.createElement("nodes");

    Element enode = document.createElement("node");
    enode.setAttribute("id", id);
    enode.setAttribute("address", address);
    enode.setAttribute("port", port+"");
    enode.setAttribute("key", base64Key);
    //enode.setIdAttributeNS(null, "id", true);
    enode.setIdAttribute("id", true);

    root.appendChild(enode);
    document.appendChild(root);

    //document.getDocumentElement().normalize();
    document.setXmlStandalone(true);

    Transformer tfactory = TransformerFactory.newInstance().newTransformer();
    tfactory.setOutputProperty(OutputKeys.METHOD, "xml");
    tfactory.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    tfactory.transform(new DOMSource(document), new StreamResult(new FileOutputStream(file)));
}

XML

<?xml version="1.0" encoding="UTF-8"?><nodes><node address="127.0.0.1" id="123123" key="ASDASDASD" port="8000"/></nodes>

标签: javaxmlparsing

解决方案


由于您知道 XML 文件的结构,因此我建议您使用 JAXB(JAva Xml 绑定)API,以便不解析原始 XML,而是将 XML 文件映射到您预定义的 POJO。

将依赖项添加到您的pom.xml

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

然后,创建您的 POJO 类(比如说Nodes.javaNode.java)并根据您的 XML 文件对字段进行注释。

@XmlRootElement(name = "nodes")
public class Nodes {

    @XmlElement(name = "node")
    private Node node;            
    
    public Node getNode() {
        return node; 
    }
}

public class Node {

    @XmlAttribute(name="address")
    private String address;

    @XmlAttribute(name="id")
    private String id;

    @XmlAttribute(name="key")
    private String key;

    @XmlAttribute(name="port")
    private String port;
    
    public String getAddress() {return address;}
    public String getId() {return id;}
    public String getKey() {return key;}
    public String getPort() {return port;}

}

因此,使用 JAXB Unmarshaller 根据您的类解析 XML 文件(注意:这里我假设 XML 文件被加载到 a 中String xmlString):

jaxbContext = JAXBContext.newInstance(Nodes.class);              
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Nodes nodes = (Nodes) jaxbUnmarshaller.unmarshal(new StringReader(xmlString)); 

此时,您的整个 XML 已加载到实例中Nodes nodes,因此您可以nodes.getNode().getId()检索您的值(以及所有其他值)。


一般注意事项:当您真的不知道 XML 文件是如何完成的并且需要探索它时,您应该使用通用 Xml 解析器。如果您知道 XML(即您知道它代表什么对象),那么最好将其表示为这样。


推荐阅读