Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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

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,我开发了GUI工具,它将XML文档显示为可编辑的JTree,用户可以在JTree中选择一个节点,并尝试更改XML文档中的实际节点值 我遇到的问题是构造正确的Xpath查询来尝试实际的更新 以下是JTree的GUI,显示选择了哪个元素并应进行编辑: 这是一个非常大的XMl,因此这里是XMl的折叠片段: 更新(忽略尝试1和2,解决第一个问题,转到尝试3和4) factory.setNamespaceAware(false); doc = dBuilder.parse(xmlFile); if (

我开发了GUI工具,它将XML文档显示为可编辑的JTree,用户可以在JTree中选择一个节点,并尝试更改XML文档中的实际节点值

我遇到的问题是构造正确的Xpath查询来尝试实际的更新

以下是JTree的GUI,显示选择了哪个元素并应进行编辑:

这是一个非常大的XMl,因此这里是XMl的折叠片段:

更新(忽略尝试1和2,解决第一个问题,转到尝试3和4)

factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
尝试1(尝试创建XPath查询以更新节点值的相关Java方法):

public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //for loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }

        }//end for loop 
        sb.append("text()");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath 
        XPath xpath = XPathFactory.newInstance().newXPath();
        //compile query 
        NodeList nodes = (NodeList) xpath.compile(sb.toString()).evaluate(doc, XPathConstants.NODESET);
        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);
    }
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest.xml, Ingest, Property_Maps, identifier, identifieXYZ]
Constructed XPath Query://Ingest/Property_Maps/identifier/text()
Jan 26, 2021 2:04:16 PM com.xyz.XmlToXsdValidator.Views.EditXmlTreeNodeDialogJFrame jButtonOkEditActionPerformed
SEVERE: null

javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:368)
 javax.xml.transform.TransformerException: Unable to evaluate expression using this context
public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        // Locate the node(s) with xpath
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");
        int lastIndexOfPathChar = sb.lastIndexOf("/");
        sb.replace(lastIndexOfPathChar, lastIndexOfPathChar + 1, "");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }

        SingleTask.currentTask.setDoc(doc);
    }
 import java.util.Arrays;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import javax.xml.XMLConstants;
    import javax.xml.namespace.NamespaceContext;
    import org.w3c.dom.Document;
    
        /**
         *
         * References:https://www.kdgregory.com/index.php?page=xml.xpath
         */
        //custom  NamespaceContext clss implementation 
        public class UniversalNamespaceResolver implements NamespaceContext
        {
            private String _prefix = "ns";
            private String _namespaceUri=null; 
            private List<String> _prefixes = Arrays.asList(_prefix);
            
            public UniversalNamespaceResolver(String namespaceResolver)
            {
                _namespaceUri = namespaceResolver; 
            }
         
            @Override
            @SuppressWarnings("rawtypes")
            public Iterator getPrefixes(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("UniversalNamespaceResolver getPrefixes() URI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefixes.iterator();
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XML_NS_PREFIX).iterator();
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XMLNS_ATTRIBUTE).iterator();
                else
                    return Collections.emptyList().iterator();
            }
        
        
            @Override
            public String getPrefix(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("nsURI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefix;
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return XMLConstants.XML_NS_PREFIX;
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return XMLConstants.XMLNS_ATTRIBUTE;
                else
                    return null;
            }
        
        
            @Override
            public String getNamespaceURI(String prefix)
            {
                if (prefix == null)
                    throw new IllegalArgumentException("prefix may not be null");
                else if (_prefix.equals(prefix))
                    return _namespaceUri;
                else if (XMLConstants.XML_NS_PREFIX.equals(prefix))
                    return XMLConstants.XML_NS_URI;
                else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
                    return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
                else
                    return null;
            }
        }
public boolean updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());
        boolean changed = false;
        // Locate the node(s) with xpath
        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {

            if (i == 0) {
                //do nothing
            } else if (i == 1) {
                sb.append("/" + pathTockens[i].trim());
            } else if (i > 1 && i != pathTockens.length - 1) {
                sb.append("/" + pathTockens[i].trim());
            } else {
                //sb.append("/" + pathTockens[i].trim());
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");

        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPathFactory xpathFactory = XPathFactory.newInstance(); 
        XPath xpath = xpathFactory.newXPath();
      
        //WITHOUT CUSTOM NAMESPACE CONTEXT xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //start for 
        Node node;
        String val = null;
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            if (nodes.item(idx).getAttributes() != null) {

                node = nodes.item(idx).getAttributes().getNamedItem("value");
                if (node != null) {

                    val = node.getNodeValue();
                    node.setNodeValue(val.replaceAll(oldValue, newValue));
                    changed = true;
                    break;
                }//end if node is found
            }
        }//end for 
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);

        return changed;
    }
Element='<identifier xmlns="http://pds.nasa.gov/pds4/pds/v1">identifier1</identifier>' 
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
正如您在日志中看到的:

所选路径=
[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest.xml,Ingest,属性映射,标识符,IdentifiedExyz]

构造的XPath查询:
//摄取/Property\u映射/identifier/text()

路径是正确的,基本上是摄取->属性映射->标识符->文本()

但是我得到了:

public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //for loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }

        }//end for loop 
        sb.append("text()");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath 
        XPath xpath = XPathFactory.newInstance().newXPath();
        //compile query 
        NodeList nodes = (NodeList) xpath.compile(sb.toString()).evaluate(doc, XPathConstants.NODESET);
        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);
    }
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest.xml, Ingest, Property_Maps, identifier, identifieXYZ]
Constructed XPath Query://Ingest/Property_Maps/identifier/text()
Jan 26, 2021 2:04:16 PM com.xyz.XmlToXsdValidator.Views.EditXmlTreeNodeDialogJFrame jButtonOkEditActionPerformed
SEVERE: null

javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:368)
 javax.xml.transform.TransformerException: Unable to evaluate expression using this context
public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        // Locate the node(s) with xpath
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");
        int lastIndexOfPathChar = sb.lastIndexOf("/");
        sb.replace(lastIndexOfPathChar, lastIndexOfPathChar + 1, "");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }

        SingleTask.currentTask.setDoc(doc);
    }
 import java.util.Arrays;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import javax.xml.XMLConstants;
    import javax.xml.namespace.NamespaceContext;
    import org.w3c.dom.Document;
    
        /**
         *
         * References:https://www.kdgregory.com/index.php?page=xml.xpath
         */
        //custom  NamespaceContext clss implementation 
        public class UniversalNamespaceResolver implements NamespaceContext
        {
            private String _prefix = "ns";
            private String _namespaceUri=null; 
            private List<String> _prefixes = Arrays.asList(_prefix);
            
            public UniversalNamespaceResolver(String namespaceResolver)
            {
                _namespaceUri = namespaceResolver; 
            }
         
            @Override
            @SuppressWarnings("rawtypes")
            public Iterator getPrefixes(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("UniversalNamespaceResolver getPrefixes() URI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefixes.iterator();
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XML_NS_PREFIX).iterator();
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XMLNS_ATTRIBUTE).iterator();
                else
                    return Collections.emptyList().iterator();
            }
        
        
            @Override
            public String getPrefix(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("nsURI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefix;
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return XMLConstants.XML_NS_PREFIX;
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return XMLConstants.XMLNS_ATTRIBUTE;
                else
                    return null;
            }
        
        
            @Override
            public String getNamespaceURI(String prefix)
            {
                if (prefix == null)
                    throw new IllegalArgumentException("prefix may not be null");
                else if (_prefix.equals(prefix))
                    return _namespaceUri;
                else if (XMLConstants.XML_NS_PREFIX.equals(prefix))
                    return XMLConstants.XML_NS_URI;
                else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
                    return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
                else
                    return null;
            }
        }
public boolean updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());
        boolean changed = false;
        // Locate the node(s) with xpath
        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {

            if (i == 0) {
                //do nothing
            } else if (i == 1) {
                sb.append("/" + pathTockens[i].trim());
            } else if (i > 1 && i != pathTockens.length - 1) {
                sb.append("/" + pathTockens[i].trim());
            } else {
                //sb.append("/" + pathTockens[i].trim());
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");

        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPathFactory xpathFactory = XPathFactory.newInstance(); 
        XPath xpath = xpathFactory.newXPath();
      
        //WITHOUT CUSTOM NAMESPACE CONTEXT xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //start for 
        Node node;
        String val = null;
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            if (nodes.item(idx).getAttributes() != null) {

                node = nodes.item(idx).getAttributes().getNamedItem("value");
                if (node != null) {

                    val = node.getNodeValue();
                    node.setNodeValue(val.replaceAll(oldValue, newValue));
                    changed = true;
                    break;
                }//end if node is found
            }
        }//end for 
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);

        return changed;
    }
Element='<identifier xmlns="http://pds.nasa.gov/pds4/pds/v1">identifier1</identifier>' 
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
尝试2(尝试创建XPath查询以更新节点值的相关Java方法):

public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //for loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }

        }//end for loop 
        sb.append("text()");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath 
        XPath xpath = XPathFactory.newInstance().newXPath();
        //compile query 
        NodeList nodes = (NodeList) xpath.compile(sb.toString()).evaluate(doc, XPathConstants.NODESET);
        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);
    }
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest.xml, Ingest, Property_Maps, identifier, identifieXYZ]
Constructed XPath Query://Ingest/Property_Maps/identifier/text()
Jan 26, 2021 2:04:16 PM com.xyz.XmlToXsdValidator.Views.EditXmlTreeNodeDialogJFrame jButtonOkEditActionPerformed
SEVERE: null

javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:368)
 javax.xml.transform.TransformerException: Unable to evaluate expression using this context
public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        // Locate the node(s) with xpath
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");
        int lastIndexOfPathChar = sb.lastIndexOf("/");
        sb.replace(lastIndexOfPathChar, lastIndexOfPathChar + 1, "");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }

        SingleTask.currentTask.setDoc(doc);
    }
 import java.util.Arrays;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import javax.xml.XMLConstants;
    import javax.xml.namespace.NamespaceContext;
    import org.w3c.dom.Document;
    
        /**
         *
         * References:https://www.kdgregory.com/index.php?page=xml.xpath
         */
        //custom  NamespaceContext clss implementation 
        public class UniversalNamespaceResolver implements NamespaceContext
        {
            private String _prefix = "ns";
            private String _namespaceUri=null; 
            private List<String> _prefixes = Arrays.asList(_prefix);
            
            public UniversalNamespaceResolver(String namespaceResolver)
            {
                _namespaceUri = namespaceResolver; 
            }
         
            @Override
            @SuppressWarnings("rawtypes")
            public Iterator getPrefixes(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("UniversalNamespaceResolver getPrefixes() URI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefixes.iterator();
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XML_NS_PREFIX).iterator();
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XMLNS_ATTRIBUTE).iterator();
                else
                    return Collections.emptyList().iterator();
            }
        
        
            @Override
            public String getPrefix(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("nsURI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefix;
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return XMLConstants.XML_NS_PREFIX;
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return XMLConstants.XMLNS_ATTRIBUTE;
                else
                    return null;
            }
        
        
            @Override
            public String getNamespaceURI(String prefix)
            {
                if (prefix == null)
                    throw new IllegalArgumentException("prefix may not be null");
                else if (_prefix.equals(prefix))
                    return _namespaceUri;
                else if (XMLConstants.XML_NS_PREFIX.equals(prefix))
                    return XMLConstants.XML_NS_URI;
                else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
                    return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
                else
                    return null;
            }
        }
public boolean updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());
        boolean changed = false;
        // Locate the node(s) with xpath
        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {

            if (i == 0) {
                //do nothing
            } else if (i == 1) {
                sb.append("/" + pathTockens[i].trim());
            } else if (i > 1 && i != pathTockens.length - 1) {
                sb.append("/" + pathTockens[i].trim());
            } else {
                //sb.append("/" + pathTockens[i].trim());
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");

        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPathFactory xpathFactory = XPathFactory.newInstance(); 
        XPath xpath = xpathFactory.newXPath();
      
        //WITHOUT CUSTOM NAMESPACE CONTEXT xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //start for 
        Node node;
        String val = null;
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            if (nodes.item(idx).getAttributes() != null) {

                node = nodes.item(idx).getAttributes().getNamedItem("value");
                if (node != null) {

                    val = node.getNodeValue();
                    node.setNodeValue(val.replaceAll(oldValue, newValue));
                    changed = true;
                    break;
                }//end if node is found
            }
        }//end for 
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);

        return changed;
    }
Element='<identifier xmlns="http://pds.nasa.gov/pds4/pds/v1">identifier1</identifier>' 
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
输出(再次无法找到节点):

public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //for loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }

        }//end for loop 
        sb.append("text()");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath 
        XPath xpath = XPathFactory.newInstance().newXPath();
        //compile query 
        NodeList nodes = (NodeList) xpath.compile(sb.toString()).evaluate(doc, XPathConstants.NODESET);
        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);
    }
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest.xml, Ingest, Property_Maps, identifier, identifieXYZ]
Constructed XPath Query://Ingest/Property_Maps/identifier/text()
Jan 26, 2021 2:04:16 PM com.xyz.XmlToXsdValidator.Views.EditXmlTreeNodeDialogJFrame jButtonOkEditActionPerformed
SEVERE: null

javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:368)
 javax.xml.transform.TransformerException: Unable to evaluate expression using this context
public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        // Locate the node(s) with xpath
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");
        int lastIndexOfPathChar = sb.lastIndexOf("/");
        sb.replace(lastIndexOfPathChar, lastIndexOfPathChar + 1, "");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }

        SingleTask.currentTask.setDoc(doc);
    }
 import java.util.Arrays;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import javax.xml.XMLConstants;
    import javax.xml.namespace.NamespaceContext;
    import org.w3c.dom.Document;
    
        /**
         *
         * References:https://www.kdgregory.com/index.php?page=xml.xpath
         */
        //custom  NamespaceContext clss implementation 
        public class UniversalNamespaceResolver implements NamespaceContext
        {
            private String _prefix = "ns";
            private String _namespaceUri=null; 
            private List<String> _prefixes = Arrays.asList(_prefix);
            
            public UniversalNamespaceResolver(String namespaceResolver)
            {
                _namespaceUri = namespaceResolver; 
            }
         
            @Override
            @SuppressWarnings("rawtypes")
            public Iterator getPrefixes(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("UniversalNamespaceResolver getPrefixes() URI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefixes.iterator();
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XML_NS_PREFIX).iterator();
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XMLNS_ATTRIBUTE).iterator();
                else
                    return Collections.emptyList().iterator();
            }
        
        
            @Override
            public String getPrefix(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("nsURI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefix;
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return XMLConstants.XML_NS_PREFIX;
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return XMLConstants.XMLNS_ATTRIBUTE;
                else
                    return null;
            }
        
        
            @Override
            public String getNamespaceURI(String prefix)
            {
                if (prefix == null)
                    throw new IllegalArgumentException("prefix may not be null");
                else if (_prefix.equals(prefix))
                    return _namespaceUri;
                else if (XMLConstants.XML_NS_PREFIX.equals(prefix))
                    return XMLConstants.XML_NS_URI;
                else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
                    return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
                else
                    return null;
            }
        }
public boolean updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());
        boolean changed = false;
        // Locate the node(s) with xpath
        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {

            if (i == 0) {
                //do nothing
            } else if (i == 1) {
                sb.append("/" + pathTockens[i].trim());
            } else if (i > 1 && i != pathTockens.length - 1) {
                sb.append("/" + pathTockens[i].trim());
            } else {
                //sb.append("/" + pathTockens[i].trim());
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");

        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPathFactory xpathFactory = XPathFactory.newInstance(); 
        XPath xpath = xpathFactory.newXPath();
      
        //WITHOUT CUSTOM NAMESPACE CONTEXT xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //start for 
        Node node;
        String val = null;
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            if (nodes.item(idx).getAttributes() != null) {

                node = nodes.item(idx).getAttributes().getNamedItem("value");
                if (node != null) {

                    val = node.getNodeValue();
                    node.setNodeValue(val.replaceAll(oldValue, newValue));
                    changed = true;
                    break;
                }//end if node is found
            }
        }//end for 
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);

        return changed;
    }
Element='<identifier xmlns="http://pds.nasa.gov/pds4/pds/v1">identifier1</identifier>' 
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
尝试#6(基于用户的响应,名称空间感知=FALSE)

factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
输出(再次无法找到节点):

public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //for loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }

        }//end for loop 
        sb.append("text()");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath 
        XPath xpath = XPathFactory.newInstance().newXPath();
        //compile query 
        NodeList nodes = (NodeList) xpath.compile(sb.toString()).evaluate(doc, XPathConstants.NODESET);
        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);
    }
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest.xml, Ingest, Property_Maps, identifier, identifieXYZ]
Constructed XPath Query://Ingest/Property_Maps/identifier/text()
Jan 26, 2021 2:04:16 PM com.xyz.XmlToXsdValidator.Views.EditXmlTreeNodeDialogJFrame jButtonOkEditActionPerformed
SEVERE: null

javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:368)
 javax.xml.transform.TransformerException: Unable to evaluate expression using this context
public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        // Locate the node(s) with xpath
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");
        int lastIndexOfPathChar = sb.lastIndexOf("/");
        sb.replace(lastIndexOfPathChar, lastIndexOfPathChar + 1, "");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }

        SingleTask.currentTask.setDoc(doc);
    }
 import java.util.Arrays;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import javax.xml.XMLConstants;
    import javax.xml.namespace.NamespaceContext;
    import org.w3c.dom.Document;
    
        /**
         *
         * References:https://www.kdgregory.com/index.php?page=xml.xpath
         */
        //custom  NamespaceContext clss implementation 
        public class UniversalNamespaceResolver implements NamespaceContext
        {
            private String _prefix = "ns";
            private String _namespaceUri=null; 
            private List<String> _prefixes = Arrays.asList(_prefix);
            
            public UniversalNamespaceResolver(String namespaceResolver)
            {
                _namespaceUri = namespaceResolver; 
            }
         
            @Override
            @SuppressWarnings("rawtypes")
            public Iterator getPrefixes(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("UniversalNamespaceResolver getPrefixes() URI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefixes.iterator();
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XML_NS_PREFIX).iterator();
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XMLNS_ATTRIBUTE).iterator();
                else
                    return Collections.emptyList().iterator();
            }
        
        
            @Override
            public String getPrefix(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("nsURI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefix;
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return XMLConstants.XML_NS_PREFIX;
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return XMLConstants.XMLNS_ATTRIBUTE;
                else
                    return null;
            }
        
        
            @Override
            public String getNamespaceURI(String prefix)
            {
                if (prefix == null)
                    throw new IllegalArgumentException("prefix may not be null");
                else if (_prefix.equals(prefix))
                    return _namespaceUri;
                else if (XMLConstants.XML_NS_PREFIX.equals(prefix))
                    return XMLConstants.XML_NS_URI;
                else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
                    return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
                else
                    return null;
            }
        }
public boolean updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());
        boolean changed = false;
        // Locate the node(s) with xpath
        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {

            if (i == 0) {
                //do nothing
            } else if (i == 1) {
                sb.append("/" + pathTockens[i].trim());
            } else if (i > 1 && i != pathTockens.length - 1) {
                sb.append("/" + pathTockens[i].trim());
            } else {
                //sb.append("/" + pathTockens[i].trim());
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");

        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPathFactory xpathFactory = XPathFactory.newInstance(); 
        XPath xpath = xpathFactory.newXPath();
      
        //WITHOUT CUSTOM NAMESPACE CONTEXT xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //start for 
        Node node;
        String val = null;
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            if (nodes.item(idx).getAttributes() != null) {

                node = nodes.item(idx).getAttributes().getNamedItem("value");
                if (node != null) {

                    val = node.getNodeValue();
                    node.setNodeValue(val.replaceAll(oldValue, newValue));
                    changed = true;
                    break;
                }//end if node is found
            }
        }//end for 
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);

        return changed;
    }
Element='<identifier xmlns="http://pds.nasa.gov/pds4/pds/v1">identifier1</identifier>' 
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
根据()??,作为
[#document:null]
返回的文档实际上可能不是问题所在

尝试#7(名称空间感知错误)

factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
还有
NamedNodeMap NamedNodeMap=doc.getAttributes()返回NULL

然而,
Node firstChild=doc.getFirstChild()
实际上返回了有效的元素

我将firstChild传递给xpath.evaluate(sb.toString(),firstChild,XPathConstants.NODE)但再次未找到所需的节点

输出(再次无法找到节点):

public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //for loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }

        }//end for loop 
        sb.append("text()");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath 
        XPath xpath = XPathFactory.newInstance().newXPath();
        //compile query 
        NodeList nodes = (NodeList) xpath.compile(sb.toString()).evaluate(doc, XPathConstants.NODESET);
        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);
    }
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest.xml, Ingest, Property_Maps, identifier, identifieXYZ]
Constructed XPath Query://Ingest/Property_Maps/identifier/text()
Jan 26, 2021 2:04:16 PM com.xyz.XmlToXsdValidator.Views.EditXmlTreeNodeDialogJFrame jButtonOkEditActionPerformed
SEVERE: null

javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:368)
 javax.xml.transform.TransformerException: Unable to evaluate expression using this context
public void updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        // Locate the node(s) with xpath
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());

        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {
            if (i == 0) {
                sb.append("//");
            } else {
                sb.append(pathTockens[i].trim());
                sb.append("/");
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");
        int lastIndexOfPathChar = sb.lastIndexOf("/");
        sb.replace(lastIndexOfPathChar, lastIndexOfPathChar + 1, "");
        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //Make the change on the selected nodes
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            Node value = nodes.item(idx).getAttributes().getNamedItem("value");
            String val = value.getNodeValue();
            value.setNodeValue(val.replaceAll(oldValue, newValue));
        }

        SingleTask.currentTask.setDoc(doc);
    }
 import java.util.Arrays;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import javax.xml.XMLConstants;
    import javax.xml.namespace.NamespaceContext;
    import org.w3c.dom.Document;
    
        /**
         *
         * References:https://www.kdgregory.com/index.php?page=xml.xpath
         */
        //custom  NamespaceContext clss implementation 
        public class UniversalNamespaceResolver implements NamespaceContext
        {
            private String _prefix = "ns";
            private String _namespaceUri=null; 
            private List<String> _prefixes = Arrays.asList(_prefix);
            
            public UniversalNamespaceResolver(String namespaceResolver)
            {
                _namespaceUri = namespaceResolver; 
            }
         
            @Override
            @SuppressWarnings("rawtypes")
            public Iterator getPrefixes(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("UniversalNamespaceResolver getPrefixes() URI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefixes.iterator();
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XML_NS_PREFIX).iterator();
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return Arrays.asList(XMLConstants.XMLNS_ATTRIBUTE).iterator();
                else
                    return Collections.emptyList().iterator();
            }
        
        
            @Override
            public String getPrefix(String uri)
            {
                if (uri == null)
                    throw new IllegalArgumentException("nsURI may not be null");
                else if (_namespaceUri.equals(uri))
                    return _prefix;
                else if (XMLConstants.XML_NS_URI.equals(uri))
                    return XMLConstants.XML_NS_PREFIX;
                else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri))
                    return XMLConstants.XMLNS_ATTRIBUTE;
                else
                    return null;
            }
        
        
            @Override
            public String getNamespaceURI(String prefix)
            {
                if (prefix == null)
                    throw new IllegalArgumentException("prefix may not be null");
                else if (_prefix.equals(prefix))
                    return _namespaceUri;
                else if (XMLConstants.XML_NS_PREFIX.equals(prefix))
                    return XMLConstants.XML_NS_URI;
                else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
                    return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
                else
                    return null;
            }
        }
public boolean updateXmlData(JTree jTree, org.w3c.dom.Document doc, TreeNode parentNode, String oldValue, String newValue) throws XPathExpressionException {
        System.out.println("Selected path=" + jTree.getSelectionPath().toString());
        boolean changed = false;
        // Locate the node(s) with xpath
        String[] pathTockens = jTree.getSelectionPath().toString().split(",");
        StringBuilder sb = new StringBuilder();
        //loop to construct xpath query 
        for (int i = 0; i < pathTockens.length - 1; i++) {

            if (i == 0) {
                //do nothing
            } else if (i == 1) {
                sb.append("/" + pathTockens[i].trim());
            } else if (i > 1 && i != pathTockens.length - 1) {
                sb.append("/" + pathTockens[i].trim());
            } else {
                //sb.append("/" + pathTockens[i].trim());
            }
        }//end loop 

        sb.append("[text()=");
        sb.append("'");
        sb.append(oldValue);
        sb.append("']");

        System.out.println("Constructed XPath Query:" + sb.toString());
        //new xpath instance 
        XPathFactory xpathFactory = XPathFactory.newInstance(); 
        XPath xpath = xpathFactory.newXPath();
      
        //WITHOUT CUSTOM NAMESPACE CONTEXT xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
        NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc, XPathConstants.NODESET);

        //start for 
        Node node;
        String val = null;
        for (int idx = 0; idx < nodes.getLength(); idx++) {
            if (nodes.item(idx).getAttributes() != null) {

                node = nodes.item(idx).getAttributes().getNamedItem("value");
                if (node != null) {

                    val = node.getNodeValue();
                    node.setNodeValue(val.replaceAll(oldValue, newValue));
                    changed = true;
                    break;
                }//end if node is found
            }
        }//end for 
        //set the new updated xml doc 
        SingleTask.currentTask.setDoc(doc);

        return changed;
    }
Element='<identifier xmlns="http://pds.nasa.gov/pds4/pds/v1">identifier1</identifier>' 
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
Selected path=[C:\Users\xyz\Documents\XsdToXmlFiles\sampleIngest_LDD.xml, Ingest_LDD, name, name1]
Constructed XPath Query:/Ingest_LDD/name[text()='name1']
Error changing value!
尝试#8(名称空间感知错误)

factory.setNamespaceAware(false);
doc = dBuilder.parse(xmlFile);

if (doc!=null)
{
    //***NOTE program comes meaning doc is NOT null,  however inspecting it shows [#document: null]
    doc.getDocumentElement().normalize();
}


//COMMENTED OUT , SINCE NAMESPACE AWARE FALSE xpath.setNamespaceContext(new UniversalNamespaceResolver(SingleTask.currentTask.getXsdFile().getXsdNameSpace()));
Node node = (Node) xpath.evaluate(sb.toString(), doc, XPathConstants.NODE);
if (node!=null)
{
    // See https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
    node.setTextContent(newValue);
    SingleTask.currentTask.setDoc(doc);
}
我还尝试将
doc.getChildNodes()
传递到
xpath.evaluate()
而不是
doc
对象作为最终的绝望尝试,请参见下面的代码片段

if (doc != null) {

            NodeList nodes = (NodeList) xpath.evaluate(sb.toString(), doc.getChildNodes(), XPathConstants.NODESET);

            String val = null;
            Node node; 
            for (int idx = 0; idx < nodes.getLength(); idx++) {
                if (nodes.item(idx).getAttributes() != null) {

                    node = nodes.item(idx).getAttributes().getNamedItem("value");
                    if (node != null) {

                        val = node.getNodeValue();
                        node.setNodeValue(val.replaceAll(oldValue, newValue));
                        changed = true;
                        break;
                    }//end if node is found
                }
            }//end for 
        }

对于联机执行的测试,XML文件似乎包含名称空间信息

考虑到这些信息,您的两个XPath计算示例可能都能工作,或者不能工作,这取决于几件事

例如,如果您使用的是非名称空间感知(默认)
DocumentBuilderFactory
,并且在XPath表达式中没有提供任何名称空间信息,那么您可能可以使用尝试4,XPath计算就足够了

但是,如果应用相反的条件,即您正在使用一个名称空间感知的
DocumentBuilderFactory
,那么尝试#3中的XPath计算也就足够了:

DocumentBuilderFactory f=DocumentBuilderFactory.newInstance();
f、 setNamespaceAware(true);
您还可以在XPath表达式中提供名称空间信息和方便的
NamespaceContext
实现。请参阅相关的SO问题和IBM文章

请注意,您不需要在XML文件和XPath表达式中提供相同的名称空间前缀,唯一的要求是XML中的名称空间感知(XPath始终是名称空间感知的)

在这种情况下,我认为两种方法都可以应用

在任何情况下,我认为问题可能与您处理实际文本替换的方式有关:您正在查找具有
属性的节点,并且查看关联的this属性不存在

请考虑下面的方法:

//您可以在两次尝试后到达这里#3和#4
Node Node=(Node)xpath.evaluate(sb.toString(),doc,XPathConstants.Node);
布尔值已更改=节点!=无效的
如果(更改){
//看https://docs.oracle.com/javase/9/docs/api/org/w3c/dom/Node.html#setTextContent-java.lang.String-
node.setTextContent(newValue);
SingleTask.currentTask.setDoc(doc);
}
回报发生变化;
此代码假定所选节点是唯一的,可以正常工作

尽管可能不同,但请注意,如果为XML中的重复元素定义相同的值,那么从
JTree
模型构建XPath选择器的方式可能会提供重复。例如,在屏幕截图中考虑元素<代码> ExulalIdIsPrimyType映射。< /P> 为了避免这种情况,在构造XPath选择器时可以采用不同的方法

您的代码片段还不清楚,但您可能正在使用作为基本
JTree
节点类型。如果是这种情况,您可以将所需的任意信息与每个节点关联

例如,考虑创建一个包含两个字段的简单POJO,节点表示的
元素的名称,以及某种唯一的生成id,让我们将其命名为
uid
uuid
,以避免与
id
属性混淆,后者很可能包含在原始XML文档中

uid
应与每个节点关联。也许您可以利用
JTree
创建过程,在处理XML文件的每个节点时,也可以包括这个属性,例如使用
UUID
类生成的属性

或者,您可以在表示之前对原始XML文档应用XSLT转换:


通过这些更改,您的XPath查询应该如下所示:

/ns:Ingest_LDD[@uid='w1ab1']/ns:Property_Maps[@uid='w1ab1a']/ns:identifier[@uid='w1ab1aq']
当然,有必要从
JTr的所选路径修改用于构造此表达式的代码