【问题标题】:How to import a string with nodes in an existing xml file using Xstream?如何使用 Xstream 在现有 xml 文件中导入带有节点的字符串?
【发布时间】:2014-01-24 12:52:15
【问题描述】:

我的问题如下。我有用户可以添加和更改的属性和参数。 我已经设法使用 Xstream 创建了新的 xml 结构。 但是现在我想将所有存储在 String 变量中的新 xml 导入到某个位置的旧 xml 文件中。我怎样才能做到这一点?

存储在我要导入的字符串中的 Xml:

<param>
  <PARAMETER>nidRB</PARAMETER>
  <DATA__TYPE>String</DATA__TYPE>
  <DESCRIPTION>A nice feature</DESCRIPTION>
  <MIN__NO>1</MIN__NO>
  <MAX__NO>1</MAX__NO>
  <ORDER1>1</ORDER1>
  <NESTED>0</NESTED>
  <DEFAULT1>NULL</DEFAULT1>
  <FORMAT>NULL</FORMAT>
</param>

xml结构如下:

<root>
<info>
</info>
  <type>
    <Object_type>blabla</Object_Type>
       <prop>
          <blab>...</blab>
        </prop>
       <param>
           <blab>...</blab>
        </param>
        <restri>
        </restri>
     <Object_type>blabla</Object_Type>
       <prop>
          <blab>...</blab>
        </prop>
        <param>
           <blab>...</blab>
        </param>
        <restri>
        </restri>
  <Object_type>blabla</Object_Type>
       <prop>
          <blab>...</blab>
        </prop>


      New XML DATA Inserted here

         <restri>
        </restri>
   </type>
</root>

我真的无法在 Xstream 文档中找到执行此操作的任何方法。

我试过了,但它不是 XStream,所以我不能使用它。

Update : 

我正在使用此代码:

public void buildNewFile() {

        XStream xstream = new XStream(new DomDriver());

        String myBigDocument = getRootFile();
        String myImportDocument = getNewContent();
        Type rootObject = (Type) xstream.fromXML(myBigDocument);
        Parameters param = (Parameters) xstream.fromXML(myImportDocument);

        Type type = (Type) rootObject.getTypes().get(0);

        type.setParam(param);

        String mergedXml = xstream.toXML(rootObject);
        System.out.println(mergedXml);
    }

    public String getRootFile() {

        String text = "";
        File file = new File("type.xml");
        try {
            Scanner scanner = new Scanner(file);

            while (scanner.hasNext()) {

                text = scanner.nextLine();

            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();
        }

        return text;

    }

    public String getNewContent() {

        String text = "";
        File file = new File("param.xml");
        try {
            Scanner scanner = new Scanner(file);

            while (scanner.hasNext()) {

                text = scanner.nextLine();

            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();
        }

        return text;

    }

它给了我这个错误:

[Fatal Error] :1:2: The markup in the document preceding the root element must be well-formed.
Exception in thread "main" com.thoughtworks.xstream.io.StreamException:  : The markup in the document preceding the root element must be well-formed.
    at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:105)
    at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:77)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1012)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1003)
    at 
xmleditor.service.CreateNewXMLData.buildNewFile(CreateNewXMLData.java:77)
    xmleditor.domain.Main.main(Main.java:10)
Caused by: org.xml.sax.SAXParseException: The markup in the document preceding the root element must be well-formed.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:98)
    ... 5 more

【问题讨论】:

  • 你能解释一下原始文件的结构吗?缩进似乎表明 prop、param 和 restri 元素是 Object_type 文档的子元素。但是 Object_type 元素在 prop 元素开始之前结束。
  • 您的getRootFilegetNewContent 方法不断将文本替换为您已阅读的最后一行,因此XML 文档无效。但是,您不需要从文件读取到字符串,XStream 可以直接从文件读取。

标签: java xml xstream


【解决方案1】:

嗯,XStream 就是将 XML 映射到 Java 对象然后再映射回来。

所以也可以解决你的问题

  • 首先合并 XML 文档(就像使用 XSLT 一样),然后通过 XStream 读取它以获得 Java 对象,或者以相反的方式进行操作
  • 将这两个文件读取为对象结构,然后使用 Java 将一个对象设置为另一个对象的子对象

如果您已经对 XStream 和 Java 有点熟悉,我猜第二种方法应该更容易。

所以你首先需要这样的东西(在 Java 伪代码中):

String myBigDocument; // Or provide XStream with a Reader on the input file or whereever you get the data from.
String myImportDocument;
Root rootObject = XStream.fromXml(myBigDocument);
Param param = XStream.fromXml(myImportDocument);
// now search the fitting element in your Root object and assign the parameter
// I just select the 1st object from your types, you'll have to do this with the fitting one.
Type type = rootObject.getInfo().getType().get(0);

// Now set the child object
type.setParam(param);

// Now convert back to XML if you need that.
String mergedXml = XStream.toXml(rootObject);

【讨论】:

  • 我在这一行收到错误消息:Type rootObject = (Type) xstream.fromXML(myBigDocument);
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多