修改java

时间:2015-07-30 23:06:43

标签: java xml

我正在寻找一个元素“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。

我甚至尝试过nodes1.setNodeValue(hostname); 但它没有用。 任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

我注意到你有AbstractMethodError。 参考说:

  

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

我担心您的Apache Xerces库可能存在问题。也许你的运行时使用的是一个没有实现Node#setTextContent(String)的旧版本(因为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>