[英]How to update XML using XPath and Java
我有一個 XML 文檔和該文檔的 XPath 表達式。 我必須在運行時使用 XPath 來更新文檔。
如何使用 Java 做到這一點?
下面是我的 xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<PersonList>
<Person>
<Name>Sonu Kapoor</Name>
<Age>24</Age>
<Gender>M</Gender>
<PostalCode>54879</PostalCode>
</Person>
<Person>
<Name>Jasmin</Name>
<Age>28</Age>
<Gender>F</Gender>
<PostalCode>78745</PostalCode>
</Person>
<Person>
<Name>Josef</Name>
<Age>232</Age>
<Gender>F</Gender>
<PostalCode>53454</PostalCode>
</Person>
</PersonList>
我必須在//PersonList/Person[2]/Name
下更改姓名和年齡的值。
使用setNodeValue
。 首先,獲取一個NodeList,例如:
myNodeList = (NodeList) xpath.compile("//MyXPath/text()")
.evaluate(myXmlDoc, XPathConstants.NODESET);
然后設置例如第一個節點的值:
myNodeList.item(0).setNodeValue("Hi mom!");
更多示例,例如這里。
正如此處的其他兩個答案以及您之前的問題中所述:從技術上講,XPath 不是“更新” XML 文檔的方法,而只能在 Z3501BB093D363810B671059B9CFED 文檔中定位節點。 但我認為以上是你想要的。
編輯:回復您的評論...您是在問如何在完成 DOM 編輯后將您的 DOM寫入XML 文件? 如果是這樣,這里有兩個例子說明如何做到這一點:
http://www.java2s.com/Code/Java/XML/WriteDOMout.htm
http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT4.html
您可以刪除該文件並創建一個新文件。
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
new InputSource("data.xml"));
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xpath.evaluate("//employee/name[text()='old']", doc,
XPathConstants.NODESET);
for (int idx = 0; idx < nodes.getLength(); idx++) {
nodes.item(idx).setTextContent("new value");
}
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(doc), new StreamResult(new File("data_new.xml")));
XPath 用於 XML 文檔的 select 部分。它沒有更新的規定。 但是由於它返回 DOM 對象(元素,如果 memory 服務,或者可能是節點),您可以使用 DOM 方法來更改文檔。
XPath
可用於select節點在一個文檔中,不可用於修改
您將 xpath 表達式應用於您的文檔並獲取一個元素(在您的情況下)。 擁有此Element
后,您可以使用Element
方法更改值(在您的情況下為姓名和年齡)
從NodeList
開始,它應該像這樣工作:
NodeList nodes = getNodeListFromXPathExpression(); // you know how
if (nodes.length == 0)
return; // empty nodelist, xpath didn't select anything
Node first = node.getItem(0); // take the first from the list, your element
// this is a shortcut for your example:
// first is the actual selected element (a node)
// .getFirst() returns the first child node, the "text node" (="Jasmine", ="28")
// .setNodeValue() replace the actual value of that text node with a new string
first.getFirstChild().setNodeValue("New Name or new age");
考慮使用 XQuery 更新而不是 XPath。 這允許你寫
replace value of node //PersonList/Person[2]/Name with "Anonymous"
這比使用 Java DOM API 要容易得多。
I've created a small project for using XPATH to create/update XML: https://github.com/shenghai/xmodifier the code to change your xml is like:
Document document = readDocument("personList.xml");
XModifier modifier = new XModifier(document);
modifier.addModify("//PersonList/Person[2]/Name", "newName");
modifier.modify();
這是一個超級酷的 function ,您可以使用xpath
修改任何 XML 文檔的任何標簽值。 您需要通過三個 arguments xml
, xpathExpression
和newValue
,它返回 XML 文件作為修改值的String
。
如果要將 XML 作為文件傳遞,則需要相應地更改 function。 但邏輯將是相同的。
public String updateXML(String xml, String xpathExpression, String newValue)
{
try {
//Creating document builder
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(new org.xml.sax.InputSource(new StringReader(xml)));
//Evaluating xpath expression using Element
XPath xpath = XPathFactory.newInstance().newXPath();
Element element = (Element)xpath.evaluate(xpathExpression, document, XPathConstants.NODE);
//Setting value in the text
element.setTextContent(value);
//Transformation of document to xml
StringWriter stringWriter = new StringWriter();
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(document), new StreamResult(stringWriter));
xml = stringWriter.toString();
}
catch (Exception e)
{
e.printStackTrace();
}
return xml;
}
這是使用vtd-xml更改內容的代碼... vtd-xml的獨特之處在於它是唯一提供增量更新功能的 API。
import com.ximpleware.*;
import java.io.*;
public class changeName {
public static void main(String s[]) throws VTDException,java.io.UnsupportedEncodingException,java.io.IOException{
VTDGen vg = new VTDGen();
if (!vg.parseFile("input.xml", false))
return;
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
XMLModifier xm = new XMLModifier(vn);
ap.selectXPath("//PersonList/Person[2]");
int i=0;
while((i=ap.evalXPath())!=-1){
if (vn.toElement(VTDNav.FIRST_CHILD,"Name")){
int k=vn.getText();
if (i!=-1)
xm.updateToken(k, "Jonathan");
vn.toElement(VTDNav.PARENT);
}
if (vn.toElement(VTDNav.FIRST_CHILD,"Age")){
int k=vn.getText();
if (i!=-1)
xm.updateToken(k, "42");
vn.toElement(VTDNav.PARENT);
}
}
xm.output("new.xml");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.