当前位置: 首页 > 知识库问答 >
问题:

Java-反序列化一个扁平化的XML文件。(XStream,JAXB,MOXy,两者取其一……)

璩正志
2023-03-14

我目前正在使用XStream来解析XML文件,但无法使它执行我需要它执行的操作。如果有必要,我会换另一个图书馆,任何可以解决这个问题的!

<product>
  <title>Transformers Best of Grimlock</title>
  <author1>Bob Budiansky</author1>
  <author2>Simon Furman</author2>
</product>

我正试图将其解析为如下所示的模型:

public class Product extends Model {

  public String title;

  public List<String> authors;

}

标题写得很好,但我很难解析作者。不幸的是,以这样一种“更合理”的格式获取XML提要并不是一种选择:

...
<authors>
  <author>Bob Budiansky</author>
  <author>Simon Furman</author>
</authors>
...

我可以做什么来将“author1”、“author2”等解析成一个列表吗?

共有1个答案

罗茂实
2023-03-14

以下方法应该适用于任何可以从StAXXMLStreamReader解封的XML绑定库。下面我将使用标准JAXB(JSR-222)API进行演示。(注:我是EclipseLink JAXB(MOXy)的负责人)。

产品

我们将对模型进行注释,就好像authors属性映射到author元素一样。

package forum11666565;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Product extends Model {

    public String title;

    @XmlElement(name = "author")
    public List<String> authors;

}
package forum11666565;

import java.io.FileInputStream;
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Product.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("src/forum11666565/input.xml"));
        xsr = new StreamReaderDelegate(xsr) {

            @Override
            public String getLocalName() {
                String localName = super.getLocalName();
                if(localName.startsWith("author")) {
                    return "author";
                } else {
                    return localName;
                }
            }

        };

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Product product = (Product) unmarshaller.unmarshal(xsr);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(product, System.out);
    }

}

input.xml

<product>
  <title>Transformers: Best of Grimlock</title>
  <author1>Bob Budiansky</author1>
  <author2>Simon Furman</author2>
</product>

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<product>
    <title>Transformers: Best of Grimlock</title>
    <author>Bob Budiansky</author>
    <author>Simon Furman</author>
</product>
 类似资料:
  • 问题内容: 我正在使用Xstream序列化Job对象。看起来不错。 但是反序列化,我有一个问题: 你们中的一个人以前遇到过这个问题吗? 这是我序列化的方法: 我也尝试这样做: 对于反序列化,我这样做是这样的: XML结构: 如果是,我想听听。提前致谢。 问题答案: fromXML没有文件名,请尝试: 以String形式读取文件内容。 在XStream中,字段名“ id”和“引用”也恰好是“系统属性

  • 问题内容: 我在这里发现了同样的问题… …但是没有正确的答案。 最好的建议之一是将嵌套对象包装到新类中,但是这种方法引入了另一个问题:乐高名称。 在我的示例中,此类的最逻辑名称是与父类相同的名称,当然这是不可能的。我的示例很简单,我只想消除父类中的“语言”属性。有人可以帮我做吗? json的示例: 问题答案: 如果JSON属性名称与c#命名约定冲突,则可以在序列化期间使用或批注替换其他名称。 例如

  • 我在尝试“反序列化”对象时遇到以下错误: 我需要能够使用这个XStream库序列化/反序列化对象,甚至是那些没有参数构造函数的对象。

  • 为了完整起见,我在下面添加了我的代码。 而且

  • 问题内容: 问题在于,每次执行main方法时,a.xml的旧内容都会丢失,并被新的内容替代。如何在不丢失先前信息的情况下将内容附加到a.xml文件? 问题答案: 样例代码

  • 问题内容: 我有一个这样的清单: 此列表中的每个项目可能包含一个数据对或一个元组,我想将此列表更改为 然后这样做: 我不知道如何更改列表结构,或者如何基于原始列表进行相同的计算? 问题答案: 如果您只想整理列表,请使用:http : //docs.python.org/library/itertools.html#itertools.chain.from_iterable