当前位置: 代码迷 >> java >> 在Java中修改XML元素
  详细解决方案

在Java中修改XML元素

热度:101   发布时间:2023-07-17 20:59:34.0

我正在寻找一个元素“ storage.hostname”并修改该元素。

这是我的代码,

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.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.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

public class testXML {

    public static void main(String argv[]) throws TransformerException {


        String filepath = "C:\\qautilsServer\\target\\";

        String hostname = "psvrhc9";
        update(filepath,hostname);  
}
    public static void update(String destDirectory, String hostname) throws TransformerException{
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        File rexsterFile = new File(destDirectory + "\\titan-rexster-server-2.5.0\\config\\rexster.xml");
        DocumentBuilder docBuilder = null;
        try
        {
            docBuilder = docFactory.newDocumentBuilder();
        }
        catch (ParserConfigurationException e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        Document doc = null;
        try
        {
            doc = docBuilder.parse(rexsterFile);
        }
        catch (SAXException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Node nodes1 = doc.getElementsByTagName("storage.hostname").item(0);
        nodes1.setTextContent(hostname);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(destDirectory + "\\config.xml");
        transformer.transform(source, result);
    }
}

我执行以下操作时遇到相同的错误

nodes1.getTextContent();

我的XML如下所示:

<graph>
        <graph-name>graph</graph-name>
        <graph-type>com.thinkaurelius.titan.tinkerpop.rexster.TitanGraphConfiguration</graph-type>
        <graph-read-only>true</graph-read-only>
        <properties>

        <storage.backend>hbase</storage.backend>
        <ids.num-partitions>1</ids.num-partitions>
        <storage.hbase.region-count>8</storage.hbase.region-count>
        <cluster.max-partitions>32</cluster.max-partitions>
        <storage.hostname>psvrhc1</storage.hostname>
        <storage.hbase.table>ldmns:titan_db</storage.hbase.table>
        <storage.hbase.skip-schema-check>false</storage.hbase.skip-schema-check>
        <query.force-index>false</query.force-index>
    </properties>
    <extensions>
        <allows>
            <allow>tp:gremlin</allow>
        </allows>
    </extensions>
</graph>

我正在关注以下问题,我不知道为什么会出现此错误:

Exception in thread "main" java.lang.AbstractMethodError: org.apache.xerces.dom.DeferredAttrImpl.setTextContent(Ljava/lang/String;)V

注意:我在jre7中运行,而不是jre8。 该代码似乎与jre8正常工作。 由于我的项目仅支持jre7,因此无法升级到jre8。

我什至尝试过node1.setNodeValue(hostname); 但是没有用。 任何帮助将不胜感激。

我注意到您遇到了 。 参考资料说:

当应用程序尝试调用抽象方法时抛出。 通常,此错误由编译器捕获; 如果自上次编译当前执行的方法以来某个类的定义发生了不兼容的更改,则仅在运行时会发生此错误。

我担心您的Apache Xerces库可能存在问题。 也许您的运行时使用的是较旧的版本,该版本未实现 (因为DOM级别3)。


以前,我修改了您的代码以创建一个最小的可复制案例。 但实际上,它运行良好。 当我在Eclipse Java EE 4.5全新设置中从文件系统读取您的完整XML时,它也起作用。 可能该代码无关紧要,但是为了以防万一,我将其保留在显示中。

import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.Node;

public class TestXML {

public static void main(String argv[]) throws TransformerException {

    try {
        String xml = "<graph>" + "<storage.hostname>psvrhc1</storage.hostname>" + "</graph>";
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(new ByteArrayInputStream(xml.getBytes()));

        Node nodes1 = doc.getElementsByTagName("storage.hostname").item(0);
        nodes1.setTextContent("blah");

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(System.out);
        transformer.transform(source, result);
    } catch (Throwable e) {
        e.printStackTrace();
    }
}
}

输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><graph><storage.hostname>blah</storage.hostname></graph>
  相关解决方案