【问题标题】:Read XML with mixed child depth?阅读具有混合子深度的 XML?
【发布时间】:2012-09-16 16:36:30
【问题描述】:

我在谷歌上找不到一个很好的例子,所以也许你知道我的教程:

我想将一个像这样嵌套的 xml 读入 java

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <art>
    <name>x</name>
    <first>y</first>
    <alist>
        <set>1</set>
        <set>2</set>
        <set>3</set>
    </alist>
  </art>
  <art>
    <name>z</name>
    <first>a</first>
    <alist>
        <set>1</set>
        <set>2</set>
        <set>3</set>
    </alist>
  </art>
...
</config>

我可以像http://www.developerfusion.com/code/2064/a-simple-way-to-read-an-xml-file-in-java/ 那样做,但没有像“设置”这样的额外标签。 我是这方面的新手,我通过示例学习。

最好的问候,

阿德里亚斯

【问题讨论】:

    标签: java xml nested


    【解决方案1】:

    我将使用这篇文章中的相同答案:How can I parse such a document?

    一个好的做法是使用反映您的 XML 架构的对象模型。

    使用该模型,您的解析器所要做的就是在解析过程中构建对象。

    您还可以使用一些出色的框架构建来将 XML 文件转换为 java 对象,例如 XStream

    【讨论】:

      【解决方案2】:

      DOM 解析器、SAX 解析器或Pull 解析器在较小的级别上很好解析,越大越难管理.....

      尝试使用以下方法:

      - JAXP and JAXB

      - Castor

      【讨论】:

        【解决方案3】:

        您可以使用JAXB (JSR-222) 将XML 读入Java 对象,您可以随意处理这些对象。 JAXB 的实现包含在从 Java SE 6 开始的 JDK/JRE 中。下面是一个示例:

        配置

        JAXB 是异常配置。这意味着您只需要在您希望 XML 表示不同于默认值的地方添加注释(请参阅:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html)。

        package forum12448687;
        
        import java.util.List;
        import javax.xml.bind.annotation.*;
        
        @XmlRootElement
        @XmlAccessorType(XmlAccessType.FIELD)
        public class Config {
        
            private List<Art> art;
        
        }
        

        艺术

        package forum12448687;
        
        import java.util.List;
        import javax.xml.bind.annotation.*;
        
        @XmlAccessorType(XmlAccessType.FIELD)
        public class Art {
        
            private String name;
        
            private String first;
        
            @XmlElementWrapper
            @XmlElement(name="set")
            private List<String> alist;
        
        }
        

        演示

        下面的代码演示了如何将 XML 读入对象,然后将其写回 XML。

        package forum12448687;
        
        import java.io.File;
        import javax.xml.bind.*;
        
        public class Demo {
        
            public static void main(String[] args) throws Exception {
                JAXBContext jc = JAXBContext.newInstance(Config.class);
        
                Unmarshaller unmarshaller = jc.createUnmarshaller();
                File xml = new File("src/forum12448687/input.xml");
                Config config = (Config) unmarshaller.unmarshal(xml);
        
                Marshaller marshaller= jc.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
                marshaller.marshal(config, System.out);
            }
        
        }
        

        input.xml/Output

        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <config>
            <art>
                <name>x</name>
                <first>y</first>
                <alist>
                    <set>1</set>
                    <set>2</set>
                    <set>3</set>
                </alist>
            </art>
            <art>
                <name>z</name>
                <first>a</first>
                <alist>
                    <set>1</set>
                    <set>2</set>
                    <set>3</set>
                </alist>
            </art>
        </config>
        

        【讨论】:

          猜你喜欢
          • 2011-11-22
          • 1970-01-01
          • 2023-03-10
          • 2015-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          相关资源
          最近更新 更多