Java 根据XPATH批量替换XML节点中的值

打印 上一主题 下一主题

主题 970|帖子 970|积分 2910

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
根据XPATH批量替换XML节点中的值

by: 授客 QQ:1033553122
测试环境

JDK 1.8.0_25
代码实操

message.xml文件
  1. <Request service="SALE_ORDER_SERVICE" lang="zh-CN">
  2.     <Head>
  3.         <AccessCode>xxxxxxxxxx12Ur8v6qkYAaOf</AccessCode>
  4.         <Checkword>xxxxxxxxxxkmPif7Z35UEJjrR</Checkword>
  5.     </Head>
  6.     <Body>
  7.         <SaleOrderRequest>
  8.             <CompanyCode>Wxxxxxxxxxx</CompanyCode>
  9.             <SaleOrders>
  10.                 <SaleOrder>
  11.                     <WarehouseCode>xxxxxxx</WarehouseCode>
  12.                     <ErpOrder>SO20220519xxxx13190</ErpOrder>
  13.                     <ErpOrderType>3</ErpOrderType>
  14.                     <orderType>10</orderType>
  15.                     <receiverAddress>未知地址</receiverAddress>
  16.                     <OrderReceiverInfo>
  17.                         <ReceiverCompany>个人</ReceiverCompany>
  18.                         <ReceiverName>凯琳</ReceiverName>
  19.                         <ReceiverCountry>中国</ReceiverCountry>
  20.                         <ReceiverProvince>广东省</ReceiverProvince>
  21.                         <ReceiverCity>江门市</ReceiverCity>
  22.                         <ReceiverArea>蓬江区</ReceiverArea>
  23.                         <ReceiverAddress>详细地址</ReceiverAddress>
  24.                     </OrderReceiverInfo>
  25.                     <OrderItems>
  26.                         <OrderItem>
  27.                             <SkuNo>1001178</SkuNo>
  28.                             <ItemName>保妇康栓1.74g*14粒/盒</ItemName>
  29.                             <ItemQuantity>1</ItemQuantity>
  30.                         </OrderItem>
  31.                         <OrderItem>
  32.                             <SkuNo>1008766</SkuNo>
  33.                             <ItemName>美团小药箱</ItemName>
  34.                             <ItemQuantity>1</ItemQuantity>
  35.                         </OrderItem>
  36.                     </OrderItems>
  37.                 </SaleOrder>
  38.             </SaleOrders>
  39.         </SaleOrderRequest>
  40.     </Body>
  41. </Request>
复制代码
XMLHelper.java
  1. import org.w3c.dom.Document;
  2. import org.w3c.dom.NodeList;
  3. import org.xml.sax.InputSource;
  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import javax.xml.transform.OutputKeys;
  7. import javax.xml.transform.Transformer;
  8. import javax.xml.transform.TransformerException;
  9. import javax.xml.transform.TransformerFactory;
  10. import javax.xml.transform.dom.DOMSource;
  11. import javax.xml.transform.stream.StreamResult;
  12. import javax.xml.xpath.XPath;
  13. import javax.xml.xpath.XPathConstants;
  14. import javax.xml.xpath.XPathExpressionException;
  15. import javax.xml.xpath.XPathFactory;
  16. import java.io.ByteArrayOutputStream;
  17. import java.io.File;
  18. import java.io.FileInputStream;
  19. import java.io.StringReader;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. public class XMLHelper {
  23.         // XML文件转XML文档对象
  24.     public static Document xmlFileToDocument(String filePath) throws Exception {
  25.         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  26.         dbf.setValidating(false);
  27.         DocumentBuilder db = dbf.newDocumentBuilder();
  28.         Document doc = db.parse(new FileInputStream(new File(filePath)));
  29.         return doc;
  30.     }
  31.         // XML文档转XML字符串
  32.     public static String docToString(Document doc) throws TransformerException {
  33.         TransformerFactory ft = TransformerFactory.newInstance();
  34.         Transformer ff = ft.newTransformer();
  35.         ff.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
  36.         ff.setOutputProperty("encoding", "gbk");
  37.         ByteArrayOutputStream bos = new ByteArrayOutputStream();
  38.         ff.transform(new DOMSource(doc), new StreamResult(bos));
  39.         return bos.toString();
  40.     }
  41.    
  42.         // XML字符串转XML文档对象
  43.     public static Document stringToDocument(String xmlData) throws Exception {
  44.         StringReader sr = new StringReader(xmlData);
  45.         InputSource is = new InputSource(sr);
  46.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  47.         DocumentBuilder builder = factory.newDocumentBuilder();
  48.         Document doc = builder.parse(is);
  49.         return doc;
  50.     }
  51.         // 替换单个XPATH指定的XML节点值
  52.     public static void replaceXmlNodeValue(Document doc, String nodePath, String value) throws XPathExpressionException {
  53.         XPathFactory factory = XPathFactory.newInstance();
  54.         XPath xpath = factory.newXPath();
  55.         // 匹配需替换的节点
  56.         NodeList nodeList = (NodeList) xpath.evaluate(nodePath, doc, XPathConstants.NODESET);
  57.                
  58.         // 单个XPATH可能匹配多个XML节点,所以需要遍历替换
  59.         for (int i = 0; i < nodeList.getLength(); i++) {
  60.             nodeList.item(i).setTextContent(value);
  61.         }
  62.     }
  63.         // 批量多个XPATH指定的XML节点值
  64.     public static void replaceXmlNodesValue(Document doc, List<String> nodesPath, String value) throws XPathExpressionException {
  65.         for (String nodePath : nodesPath) {
  66.             XMLHelper.replaceXmlNodeValue(doc, nodePath, value);
  67.         }
  68.     }
  69.        
  70.        
  71.     public static void replaceReceiverAddress(Document doc, String value) throws Exception{
  72.         List nodesPath= new ArrayList();
  73.         nodesPath.add(".//OrderReceiverInfo/ReceiverAddress");
  74.         nodesPath.add(".//receiverAddress");
  75.         XMLHelper.replaceXmlNodesValue(doc, nodesPath, value);
  76.     }
  77.        
  78.         public static void main(String []args) {        
  79.         try {
  80.             Document doc = XMLHelper.xmlFileToDocument("message.xml");
  81.             // 替换地址
  82.             XMLHelper.replaceReceiverAddress(doc, "吉祥街道幸福社区1号大楼23号");
  83.      
  84.             String newXml = XMLHelper.docToString(doc);
  85.             System.out.println(newXml);
  86.         } catch (Exception e) {
  87.             e.printStackTrace();
  88.         }
  89.       
  90.     }
  91. }
复制代码
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表