Java 使用DOM4J更改XML属性的最佳方法是什么

Java 使用DOM4J更改XML属性的最佳方法是什么,java,xml,dom4j,Java,Xml,Dom4j,我试图用DOM4J修改XML文件上的一个值。文件不太大,但有很多标记: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <process version="5.3.013"> <context> <input/> <output/> <macros/> </context> <operator activate

我试图用DOM4J修改XML文件上的一个值。文件不太大,但有很多标记:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<process version="5.3.013">
  <context>
    <input/>
    <output/>
    <macros/>
  </context>
  <operator activated="true" class="process" compatibility="5.3.013" expanded="true" name="Process">
    <parameter key="logverbosity" value="init"/>
    <parameter key="random_seed" value="2001"/>
    <parameter key="send_mail" value="never"/>
    <parameter key="notification_email" value=""/>
    <parameter key="process_duration_for_mail" value="30"/>
    <parameter key="encoding" value="SYSTEM"/>
    <process expanded="true">
      <operator activated="true" class="read_csv" compatibility="5.3.013" expanded="true" height="60" name="Read CSV" width="90" x="45" y="30">
        <parameter key="csv_file" value="C:\Documents and Settings\Geral\workspace\AdaptDBAnalisysPlatform_Core\Results\QueryResults\P1\Results1.csv"/>
        <parameter key="column_separators" value=","/>
        <parameter key="trim_lines" value="false"/>
        <parameter key="use_quotes" value="true"/>
        <parameter key="quotes_character" value="&quot;"/>
        <parameter key="escape_character" value="\"/>
        <parameter key="skip_comments" value="false"/>
        <parameter key="comment_characters" value="#"/>
        <parameter key="parse_numbers" value="true"/>
        <parameter key="decimal_character" value="."/>
        <parameter key="grouped_digits" value="false"/>
        <parameter key="grouping_character" value=","/>
        <parameter key="date_format" value=""/>
        <parameter key="first_row_as_names" value="false"/>
        <list key="annotations">
          <parameter key="0" value="Name"/>
        </list>
        <parameter key="time_zone" value="SYSTEM"/>
        <parameter key="locale" value="English (United States)"/>
        <parameter key="encoding" value="windows-1252"/>
        <list key="data_set_meta_data_information">
          <parameter key="0" value="idUSER.true.integer.id"/>
          <parameter key="1" value="GENERO.true.integer.attribute"/>
          <parameter key="2" value="IDADE.true.binominal.attribute"/>
          <parameter key="3" value="PALAVRACHAVE.true.polynominal.label"/>
        </list>
        <parameter key="read_not_matching_values_as_missings" value="true"/>
        <parameter key="datamanagement" value="double_array"/>
      </operator>
      <operator activated="true" class="set_role" compatibility="5.3.013" expanded="true" height="76" name="Set Role" width="90" x="45" y="165">
        <parameter key="attribute_name" value="PALAVRACHAVE"/>
        <parameter key="target_role" value="label"/>
        <list key="set_additional_roles">
          <parameter key="idUSER" value="id"/>
        </list>
      </operator>
      <operator activated="true" class="k_medoids" compatibility="5.3.013" expanded="true" height="76" name="Clustering (2)" width="90" x="246" y="30">
        <parameter key="add_cluster_attribute" value="true"/>
        <parameter key="add_as_label" value="true"/>
        <parameter key="remove_unlabeled" value="false"/>
        <parameter key="k" value="4"/>
        <parameter key="max_runs" value="100"/>
        <parameter key="max_optimization_steps" value="100"/>
        <parameter key="use_local_random_seed" value="false"/>
        <parameter key="local_random_seed" value="1992"/>
        <parameter key="measure_types" value="MixedMeasures"/>
        <parameter key="mixed_measure" value="MixedEuclideanDistance"/>
        <parameter key="nominal_measure" value="DiceSimilarity"/>
        <parameter key="numerical_measure" value="EuclideanDistance"/>
        <parameter key="divergence" value="GeneralizedIDivergence"/>
        <parameter key="kernel_type" value="radial"/>
        <parameter key="kernel_gamma" value="1.0"/>
        <parameter key="kernel_sigma1" value="1.0"/>
        <parameter key="kernel_sigma2" value="0.0"/>
        <parameter key="kernel_sigma3" value="2.0"/>
        <parameter key="kernel_degree" value="3.0"/>
        <parameter key="kernel_shift" value="1.0"/>
        <parameter key="kernel_a" value="1.0"/>
        <parameter key="kernel_b" value="0.0"/>
      </operator>
      <operator activated="true" class="map_clustering_on_labels" compatibility="5.3.013" expanded="true" height="76" name="Map Clustering on Labels" width="90" x="313" y="165"/>
      <connect from_op="Read CSV" from_port="output" to_op="Set Role" to_port="example set input"/>
      <connect from_op="Set Role" from_port="example set output" to_op="Clustering (2)" to_port="example set"/>
      <connect from_op="Clustering (2)" from_port="cluster model" to_op="Map Clustering on Labels" to_port="cluster model"/>
      <connect from_op="Clustering (2)" from_port="clustered set" to_op="Map Clustering on Labels" to_port="example set"/>
      <connect from_op="Map Clustering on Labels" from_port="example set" to_port="result 1"/>
      <portSpacing port="source_input 1" spacing="0"/>
      <portSpacing port="sink_result 1" spacing="0"/>
      <portSpacing port="sink_result 2" spacing="0"/>
    </process>
  </operator>
</process>
显然,Xpath是正确的:通过确认,但我得到以下异常,这表明Xpath显然不正常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
    at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
    at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
    at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
    at general.XMLParser.modifyDocument(XMLParser.java:38)
    at dataMinning.processes.P1.<init>(P1.java:15)
    at dataMining.ModelCaller.Model1(ModelCaller.java:22)
    at dataMining.ModelCaller.work(ModelCaller.java:16)
    at general.Begin.main(Begin.java:22)
Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 8 more
线程“main”java.lang.NoClassDefFoundError中的异常:org/jaxen/JaxenException 位于org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230) 位于org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207) 位于org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164) 位于general.XMLParser.modifyDocument(XMLParser.java:38) 在dataMinning.processs.P1.(P1.java:15) 位于dataMining.ModelCaller.Model1(ModelCaller.java:22) 位于dataMining.ModelCaller.work(ModelCaller.java:16) 在general.Begin.main(Begin.java:22) 原因:java.lang.ClassNotFoundException:org.jaxen.JaxenException 位于java.net.URLClassLoader$1.run(未知源) 位于java.net.URLClassLoader$1.run(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.net.URLClassLoader.findClass(未知源) 位于java.lang.ClassLoader.loadClass(未知源) 位于sun.misc.Launcher$AppClassLoader.loadClass(未知源) 位于java.lang.ClassLoader.loadClass(未知源) ... 8个以上 我看没什么问题。我错过了什么


提前感谢

正如keshlam所建议的,使用W3CDOM解决这个问题要容易得多。 下面是我将值4更新为行中另一个值的解决方案

import java.io.ByteArrayInputStream;
导入java.io.File;
导入java.io.IOException;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.transform.Transformer;
导入javax.xml.transform.TransformerException;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.NamedNodeMap;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
导入org.xml.sax.SAXException*/
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.xpath.xpath;
导入javax.xml.xpath.XPathConstants;
导入javax.xml.xpath.XPathExpressionException;
导入javax.xml.xpath.XPathFactory;
导入org.w3c.dom.Document;
导入org.w3c.dom.NamedNodeMap;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
导入org.xml.sax.SAXException;
导入javax.xml.transform.Transformer;
导入javax.xml.transform.TransformerConfiguration异常;
导入javax.xml.transform.TransformerException;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入org.w3c.dom.Element;
公共类XMLParser{
公共void modifyDocument(字符串inputXml)
{
试一试{
FileInputStream文件=新FileInputStream(新文件(inputXml));
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder=builderFactory.newDocumentBuilder();
Document xmlDocument=builder.parse(文件);
XPath=XPathFactory.newInstance().newXPath();
字符串表达式=“//运算符[@class='k_medoids']]/参数[@key='k']”;
字符串email=xPath.compile(表达式).evaluate(xmlDocument);
NodeList NodeList=(NodeList)xPath.compile(expression.evaluate(xmlDocument,XPathConstants.NODESET);
System.out.println(nodeList.getLength());
for(int i=0;i
我必须说XPath非常有用


致以最良好的祝愿

我刚刚想好了。杰克森图书馆不见了。但我仍然无法成功地更改文件。我必须承认,我一直忽略了这个文件,因为我个人对DOM4J有偏见。据我所知,与更具可移植性的W3CDOM相比,它确实没有明显的优势,因此我没有b
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
    at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
    at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
    at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
    at general.XMLParser.modifyDocument(XMLParser.java:38)
    at dataMinning.processes.P1.<init>(P1.java:15)
    at dataMining.ModelCaller.Model1(ModelCaller.java:22)
    at dataMining.ModelCaller.work(ModelCaller.java:16)
    at general.Begin.main(Begin.java:22)
Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 8 more
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;*/


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;



import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;



import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Element;




public class XMLParser {


     public void modifyDocument(String inputXml)
     {


                 try {
                     FileInputStream file = new FileInputStream(new File(inputXml));

                     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

                     DocumentBuilder builder =  builderFactory.newDocumentBuilder();

                     Document xmlDocument = builder.parse(file);

                     XPath xPath =  XPathFactory.newInstance().newXPath();

                     String expression = "//operator[@class='k_medoids']/parameter[@key='k']";
                     String email = xPath.compile(expression).evaluate(xmlDocument);

                     NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);

                     System.out.println(nodeList.getLength());
                     for (int i = 0; i < nodeList.getLength(); i++) {

                         NamedNodeMap attr = nodeList.item(i).getAttributes();
                        Node nodeAttr = attr.getNamedItem("value");
                        nodeAttr.setTextContent("VALUE TO CHANGE"); 
                     }

                  // write the content into xml file
                        TransformerFactory transformerFactory = TransformerFactory.newInstance();
                        Transformer transformer = transformerFactory.newTransformer();
                        DOMSource source = new DOMSource(xmlDocument);
                        StreamResult result = new StreamResult(new File(inputXml));
                        transformer.transform(source, result);              

                 } catch (FileNotFoundException e) {
                     e.printStackTrace();
                 } catch (SAXException e) {
                     e.printStackTrace();
                 } catch (IOException e) {
                     e.printStackTrace();
                 } catch (ParserConfigurationException e) {
                     e.printStackTrace();
                 } catch (XPathExpressionException e) {
                     e.printStackTrace();
                 } catch (TransformerConfigurationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (TransformerException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }       
             }

}