繁体   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