簡體   English   中英

如何使用 Java 將 xml 中的屬性替換為不同的值?

[英]How can I replace an attribute in xml with different value using Java?

我有一個 xml 文件:

<pickingOrderBeginEventMessage>
    <MessageBody>
        <RoutingInfo>
            <SourceNode>
                <location>
                    <countryCode>US</countryCode>
                </location>
            </SourceNode>
        </RoutingInfo>
            <fulfillmentOrders>
                <fulfillmentOrder>
                    <orderNbr>784</orderNbr>
                </fulfillmentOrder>
            </fulfillmentOrders>
    </MessageBody>
</pickingOrderBeginEventMessage>

我想將<orderNbr>784</orderNbr>更改為<orderNbr>784778474484747</orderNbr>

這是我的方法:
(請注意,我使用的是dom4j 。)

    public String replaceXML(String attribute,String oldValue, String newValue) throws SAXException, DocumentException, IOException, TransformerException {
        SAXReader xmlReader = new SAXReader();
        Document input = xmlReader.read("src/test/resources/xml/pick_begin.xml");
        xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        xmlReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
        xmlReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        String expr = String.format("//*[contains(@%s, '%s')]", attribute, oldValue);
        XPath xpath = DocumentHelper.createXPath(expr);
        List<Node> nodes = xpath.selectNodes(input);
        for (int i = 0; i < nodes.size(); i++) {
            Element element = (Element) nodes.get(i);
            element.addAttribute(attribute, newValue);
        }
        TransformerFactory factory = TransformerFactory.newInstance();
        factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        Transformer xformer = factory.newTransformer();
        xformer.setOutputProperty(OutputKeys.INDENT, "yes");
        Writer output = new StringWriter();
        xformer.transform(new DocumentSource(input), new StreamResult(output));
        return output.toString();
    }
}

其中 String 屬性為 orderNbr,oldValue 為 784,newValue 為 78455556767。

但是使用這種方法,新值不會被替換。 我哪里錯了?

根據您問題中的 XML 文件, orderNbr是一個元素而不是一個屬性,它的文本值為 784。所以您想用 78455556767 替換文本值。

您的代碼不會更改原始 XML 因為您的 XPath 查詢字符串找不到任何內容。

因此,您需要更改代碼中的兩件事。

  1. XPath 查詢字符串。
  2. 您調用更改 XML 的方法。

下面的代碼包含兩個更改。 更改的行在行尾用以下注釋指示。

// 在這里改變

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.List;

import javax.xml.XMLConstants;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.XPath;
import org.dom4j.io.DocumentSource;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;

public class ChngAttr {
    public static String replaceXML(String attribute,
                                    String oldValue,
                                    String newValue) throws DocumentException,
                                                            IOException,
                                                            SAXException,
                                                            TransformerException {
        SAXReader xmlReader = new SAXReader();
        Document input = xmlReader.read("pick_begin.xml");
        xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        xmlReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
        xmlReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        String expr = String.format("//%s[text() = '%s']", attribute, oldValue); // CHANGE HERE
        XPath xpath = DocumentHelper.createXPath(expr);
        List<Node> nodes = xpath.selectNodes(input);
        for (int i = 0; i < nodes.size(); i++) {
            Element element = (Element) nodes.get(i);
            element.setText(newValue); // CHANGE HERE
        }
        TransformerFactory factory = TransformerFactory.newInstance();
        factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        Transformer xformer = factory.newTransformer();
        xformer.setOutputProperty(OutputKeys.INDENT, "yes");
        Writer output = new StringWriter();
        xformer.transform(new DocumentSource(input), new StreamResult(output));
        return output.toString();
    }

    public static void main(String[] args) throws Exception {
        String result = replaceXML("orderNbr", "784", "78455556767");
        System.out.println(result);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM