gpt4 book ai didi

java - 在 Java 中用字符串替换 XML 文档中的元素

转载 作者:行者123 更新时间:2023-12-01 15:20:01 45 4
gpt4 key购买 nike

我正在编写一个 HTTP 服务器,我将在其中接收 HTTP PUT 中的 XPATH 以及请求正文中的数据。

我需要将 XPATH 表达式的结果替换为 XML 文档中 HTTP 请求数据中的数据

例如

XML 文档是

<presence>
<tuple id="x8eg92n">
<note> i am reading email 3 times a day </note>
</tuple>
</presence>

HTTP 请求例如类似于

  PUT /pidf-manipulation/users/sip:someone@example.com/index/
~~/presence/tuple%5b@id='x8eg92n'%5d/note HTTP/1.1
If-Match: "xyz"
Host: xcap.example.com
Content-Type: application/xcap-el+xml
...

<note>I'm reading mails on Tuesdays and Fridays</note>

上面的内容应该用 PUT 请求的元素替换 XML 中的 note 元素。客户端可以通过这种方式发送任何 XPATH 并替换 XML 文档的内容。

请帮助了解如何在 Java 代码中完成此操作。

最佳答案

基本上你需要做的是:

  1. 加载要更改的xml;
  2. 加载您想要在替换中使用的片段;
  3. 将您在[2]中加载的节点应用到您在[1]上加载的文档中;
  4. 使用 XPath 查找要替换的节点;
  5. 从您在[4]中找到的节点获取父节点,从父节点中删除在[4]中找到的节点,然后添加您采用的节点。

你可以使用类似的东西:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

public class XmlXPathReplace {

public static void main(final String[] args) throws SAXException, IOException, ParserConfigurationException,
XPathExpressionException, TransformerException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = factory.newDocumentBuilder();

// step 1.
Document doc = builder.parse(new ByteArrayInputStream(( //
"<?xml version=\"1.0\"?>" + //
"<people>" + //
"<person><name>First Person Name</name></person>" + //
"<person><name>Second Person Name</name></person>" + //
"</people>" //
).getBytes()));

// step 2
String fragment = "<name>Changed Name</name>";
Document fragmentDoc = builder.parse(new ByteArrayInputStream(fragment.getBytes()));

// step 3
Node injectedNode = doc.adoptNode(fragmentDoc.getFirstChild());

// step 4
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xPath.compile("//people/person[2]/name");
System.out.println();
Element nodeFound = (Element) expr.evaluate(doc, XPathConstants.NODE);

// step 5
Node parentNode = nodeFound.getParentNode();
parentNode.removeChild(nodeFound);
parentNode.appendChild(injectedNode);

DOMSource domSource = new DOMSource(doc);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StreamResult result = new StreamResult(new StringWriter());
transformer.transform(domSource, result);
System.out.println(result.getWriter().toString());
}

}

关于java - 在 Java 中用字符串替换 XML 文档中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11066256/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com