Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用xpath查找xml中的节点值或属性,并用另一个值替换它?_Java_Xml_Xpath - Fatal编程技术网

如何在Java中使用xpath查找xml中的节点值或属性,并用另一个值替换它?

如何在Java中使用xpath查找xml中的节点值或属性,并用另一个值替换它?,java,xml,xpath,Java,Xml,Xpath,以下是我目前的代码: // locate the node(s) XPath xpath = XPathFactory.newInstance().newXPath(); NodeList nodes = (NodeList)xpath.evaluate("//root[text()='input[1]']", doc, XPathConstants.NODESET); // make the change for (int idx = 0; idx < nodes.getLength(

以下是我目前的代码:

// locate the node(s)
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList)xpath.evaluate("//root[text()='input[1]']", doc, XPathConstants.NODESET);

// make the change
for (int idx = 0; idx < nodes.getLength(); idx++) {
    nodes.item(idx).setTextContent(input[3]);
}

// save the result
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(doc), new StreamResult(new File(outputFile)));
//找到节点
XPath=XPathFactory.newInstance().newXPath();
NodeList nodes=(NodeList)xpath.evaluate(“//root[text()='input[1]']”,doc,XPathConstants.NODESET);
//改变
对于(int idx=0;idx

输入[1]是我在XML中寻找的内容,输入[3]是它正在被替换的内容

以下是XML:

<root> 
    <accounts> 
        <account name="Bill Gates">
            <position>CEO</position> 
            <phoneNumber>123-485-1854</phoneNumber>
            <notes>Runs the company</notes> 
        </account> 
        <account name="Service Account"/> 
        <account name="Burt Mackland"> 
            <position>CFO</position> 
            <phoneNumber>345-415-4813</phoneNumber> 
            <notes>Great CFO</notes> </account> 
        <account name="Joe Smith"> 
            <position>Accountant</position>
            <reportsTo>Burt Mackland</reportsTo>
            <phoneNumber>135-118-7815</phoneNumber> 
            <notes>Must have ID checked at all Gates</notes>
        </account> 
    </accounts> 
    <departments> 
        <deparment name="Finance"> 
            <employeeCount>2</employeeCount> 
        </deparment> 
        <department name="Human Resources"> 
            <employeeCount>0</employeeCount> 
        </department> 
        <department name="Executive"> 
            <employeeCount>2</employeeCount>
        </department> 
    </departments> 
</root>

首席执行官
123-485-1854
经营公司
首席财务官
345-415-4813 
伟大的首席财务官
会计
伯特·麦克兰德
135-118-7815 
必须在所有大门检查身份证
2.
0
2.
用户可能不知道XML中的内容。因此,我无法在代码中硬编码Xpath。
请任何人将不胜感激

当您想要在任何元素中搜索文本时(不仅仅是
),请将XPath表达式从

//根[text()='text-TO-BE-FOUND']

/*[text()='text-TO-BE-FOUND']
要查找具有相同值的所有属性,必须使用以下XPath表达式:

/*/@*[.='TEXT-TO-BE-FOUND']
此外,由于无法硬编码,请将
TEXT-TO-BE-FOUND
设置为变量。(注意:
待查找文本
必须转义,它可能不包含
,因为它会影响XPath表达式。)

工作代码如下。它将用输入值替换所有元素和所有属性:
导入java.io.File;
导入java.util.Scanner;
导入javax.xml.parsers.*;
导入javax.xml.transform.*;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入javax.xml.xpath.*;
导入org.w3c.dom.*;
公共类XML更改{
公共静态void main(字符串argv[])引发异常{
扫描仪键盘=新扫描仪(System.in);
System.out.print(“键入textToFind,textToReplace:”);//键入,例如CEO、首席执行官
String next=keyboard.nextLine();
字符串[]输入=next.split(“,”);
字符串textToFind=input[0]。替换(“'”、“\\'”);/“CEO”;
字符串textToReplace=input[1]。替换(“'”、“\\'”);/“首席执行官”;
字符串filepath=“root.xml”;
字符串filetobesave=“root2.xml”;
DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docFactory.newDocumentBuilder();
Document doc=docBuilder.parse(文件路径);
XPath=XPathFactory.newInstance().newXPath();
//改变要素
字符串xPathExpression=“/*[text()=”+textToFind+“']”;
NodeList节点=(NodeList)xpath.evaluate(xPathExpression、doc、XPathConstants.NODESET);
对于(int idx=0;idx对于(int i=0;iHmmm…这是一个非常好的主意,但由于某些原因,将其作为变量似乎不起作用。我让用户输入要查找的文本和要替换的文本,因此我也不能硬编码这些文本。//找到节点XPath=XPathFactory.newInstance().newXPath();NodeList nodes=(NodeList)XPath.evaluate(input[1],doc,xpathcontents.NODESET);我有它,我有用户输入:System.out.println(“修改基本文件类型:”);System.out.println(“查找,/*[text()=”),替换为,”);要使代码正常工作,
输入必须是
字符串[]
,第二项(即索引
1
),应该是xPath表达式。您从何处获取此用户输入?我还需要能够查看属性值,并在必要时替换它们…还有人知道我如何部分更改节点值和属性值吗?这意味着,给定搜索词“Gates”它可以在两个地方找到,一个是节点值,另一个是属性值。我应该如何更改它,以便仅用用户输入替换单词Gates?
import java.io.File;
import java.util.Scanner;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class XmlChange {

    public static void main(String argv[]) throws Exception {
        Scanner keyboard = new Scanner(System.in);
        System.out.print("Type like textToFind,textToReplace: "); // type, for example CEO,Chief Executive Officer
        String next = keyboard.nextLine();
        
        String[] input = next.split(",");
        
        String textToFind = input[0].replace("'", "\\'"); //"CEO";
        String textToReplace = input[1].replace("'", "\\'"); // "Chief Executive Officer";
        String filepath = "root.xml";
        String fileToBeSaved = "root2.xml";

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(filepath);

        XPath xpath = XPathFactory.newInstance().newXPath();
        // change ELEMENTS


        String xPathExpression = "//*[text()='" + textToFind + "']";
        NodeList nodes = (NodeList) xpath.evaluate(xPathExpression, doc, XPathConstants.NODESET);

        for (int idx = 0; idx < nodes.getLength(); idx++) {
            nodes.item(idx).setTextContent(textToReplace);
        }
        
        // change ATTRIBUTES
        String xPathExpressionAttr = "//*/@*[.='" + textToFind + "']";
        NodeList nodesAttr = (NodeList) xpath.evaluate(xPathExpressionAttr, doc, XPathConstants.NODESET);
        
        for(int i=0; i<nodesAttr.getLength(); i++) {
            nodesAttr.item(i).setTextContent(textToReplace);
        }
        System.out.println("Everything replaced.");

        // save xml file back
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File(fileToBeSaved));
        transformer.transform(source, result);
    }
}