java - 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>
解决方案
由于您知道 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.java
和Node.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(即您知道它代表什么对象),那么最好将其表示为这样。
推荐阅读
- excel - 如果整行使用 VBA 匹配,则删除重复的行
- jquery - 如何将复选框的状态作为变量获取到 ajax 对象中
- javascript - 为什么我的反应网络应用程序返回一个白色/空白页面?
- python-3.x - 其他语言的 pyenchant
- flutter - 颤动中的复选框的SetState
- python - 用于 VGG19 大规模预测的 GPU 多处理
- html - 在 React 表单提交上自动聚焦 div
- javascript - 在 JavaScript 中运行异步查询时的调用堆栈和事件循环
- javascript - 即使路径正确也无法访问 javascript 文件
- javascript - Discord JS Bot - 如何让我的机器人扫描传入消息中的关键字,然后断开用户与语音通道的连接