【问题标题】:Unmarshal JAXB elements with same tag as in parent and child使用与父子元素相同的标签解组 JAXB 元素
【发布时间】:2019-05-31 09:35:15
【问题描述】:

我想用JAXB 解组下面的XML,这样我就可以导航到子节点来读取叶子标签元素。

<root>
   <concept name="GrandParent">
    <concept name="Parent1">
        <concept name="Child11">
            <input>some child input11</input>
        </concept>
        <concept name="Child12">
            <input>some child input21</input>
        </concept>
    </concept>      
    <concept name="Parent2">
            <concept name="Child21">
                <input>some child input21</input>
            </concept>
            <concept name="Child22">
                 <input>some child input22</input>
            </concept>
    </concept>
   </concept>   
</root> 

我希望 parent1 和 parent 2 的孩子数。

【问题讨论】:

    标签: java xml jaxb deserialization xml-deserialization


    【解决方案1】:

    您需要构建模型,使用JAXB 注释进行注释并解析给定的XML。见下例:

    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Unmarshaller;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    import java.io.File;
    import java.util.List;
    
    public class XmlMapperApp {
    
        public static void main(String[] args) throws Exception {
            File xmlFile = new File("./resource/test.xml").getAbsoluteFile();
    
            JAXBContext jaxbContext = JAXBContext.newInstance(Roots.class);
    
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            Concept root = ((Roots) unmarshaller.unmarshal(xmlFile)).getConcept();
            root.getConcept().forEach(System.out::println);
        }
    }
    
    @XmlRootElement(name = "root")
    @XmlAccessorType(XmlAccessType.FIELD)
    class Roots {
    
        private Concept concept;
    
        // getters, setters, toString
    }
    
    @XmlType(name = "concept")
    @XmlAccessorType(XmlAccessType.FIELD)
    class Concept {
    
        @XmlAttribute
        private String name;
    
        @XmlElement
        private List<Concept> concept;
    
        @XmlElement
        private String input;
    
        // getters, setters, toString
    }
    

    上面的代码打印:

    Concept{name='Parent1', concept=[Concept{name='Child11', concept=null, input='some child input11'}, Concept{name='Child12', concept=null, input='some child input21'}], input='null'}
    Concept{name='Parent2', concept=[Concept{name='Child21', concept=null, input='some child input21'}, Concept{name='Child22', concept=null, input='some child input22'}], input='null'}
    

    【讨论】:

    • 感谢您的帮助,我想导航到输入标签中的子元素及其值,我该怎么做
    • @Prashanth,看看更新的答案。 Concept 节点创建树结构。您需要使用 getter 导航到必填字段。
    猜你喜欢
    • 1970-01-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
    相关资源
    最近更新 更多