我有一个包含消息的xml文件:
<bus>
<message id="58afdb36-9080-4dd8-922e-ee516b2b5073">
<retrievedDate>Mon Feb 18 14:43:23 GMT 2013</retrievedDate>
<addedDate>Mon Feb 18 14:43:23 GMT 2013</addedDate>
<state>initialised</state>
<content>content placeholder</content>
</message>
</bus>
我正在创建一种方法来更改给定ID的消息状态。
但是当我尝试获取具有我想要的ID的节点时,我一直收到NullPointerException。尝试过使用 getElementById 和 getElementsByTagName ,但我总是得到null而不是我想要的节点。
public static int updateMessageState(UUID messageID, String newState)
throws ParserConfigurationException,
SAXException, IOException, TransformerException {
String filepath = "data.xml";
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(filepath);
// Get Message
Node message = doc.getElementById(messageID.toString());
// Find and update the state
NamedNodeMap atrMap = message.getAttributes();
Node nodeAtr = atrMap.getNamedItem("state");
nodeAtr.setTextContent(newState);
// Save write to XML
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(filepath));
transformer.transform(source, result);
return 0;
}
答案 0 :(得分:1)
使用getElementById()
时,您必须确保属性“id”的类型为ID
,否则将从该方法返回null。请参阅here。
我没有看到您如何使用getElementsByTagName(String str)
的示例,因此我将提供一个示例。使用getElementsByTagName()
时,您实际上会获得与具有标记的元素相对应的NodeList
。在您的示例中,您将使用doc.getElementsByName("message")
来检索消息元素的节点列表。然后,您可以使用节点列表找到您要查找的内容。
答案 1 :(得分:1)
您可以使用元素获取ID:
// Get the main element by tag name
Node bus = doc.getElementsByTagName("bus").item(0);
//get a NodeList
NodeList list = bus.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
System.out.println("\nCurrent Element :" + node.getNodeName());
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) node;
System.out.println(" id : " + eElement.getAttribute("id"));
}
}