有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (1) 个答案

  1. # 1 楼答案

    好吧,你可以做到,但如果你不采用传统的方法,那么它将变得非常棘手。以下是您可以尝试的代码:

    XML:

    <parent>
        <child name="Child" age="1" />
    </parent>
    

    根目录:

    @XmlRootElement(name = "parent")
    @XmlAccessorType(XmlAccessType.PROPERTY)
    public class Root {
        @XmlJavaTypeAdapter(Adapter.class)
        private String child;
    }
    

    孩子:

    @Data
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Child {
        @XmlAttribute
        private String name;
    
        @XmlAttribute
        private String age;
    }
    

    适配器:

    public class Adapter extends XmlAdapter<Child, String> {
    
        public String unmarshal(Child pC) throws Exception {
            System.out.println(pC.toString());
            return null;
        }
    
        public Child marshal(String pC) throws Exception {
            return null;
        }
    }
    

    主要内容:

    public class Main {
        public static void main(String[] args) throws JAXBException, XMLStreamException {
            final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("sample.xml");
            final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
            final Unmarshaller unmarshaller = JAXBContext.newInstance(Root.class).createUnmarshaller();
            final Root root = unmarshaller.unmarshal(xmlStreamReader, Root.class).getValue();
            System.out.println(root.toString());
        }
    }
    
    

    输出:

    Child(name=Child, age=1)
    

    已更新,可存储所有内容,无需子类

    XML:

    <parent>
        <child name="Child" age="1" />
    </parent>
    

    根目录:

    @Data
    @XmlRootElement(name = "parent")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Root {
        @XmlAnyElement
        private List<Object> any;
    }
    

    主要内容:

    public class Main {
        public static void main(String[] args) throws JAXBException, XMLStreamException {
            final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("sample.xml");
            final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
            final Unmarshaller unmarshaller = JAXBContext.newInstance(Root.class).createUnmarshaller();
            final Root root = unmarshaller.unmarshal(xmlStreamReader, Root.class).getValue();
            System.out.println(root.toString());
    
            Marshaller marshaller = JAXBContext.newInstance(Root.class).createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "US-ASCII");
            //marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", new XmlCharacterHandler());
            marshaller.marshal(root, System.out);
        }
    }
    

    XML:

    Root(any=[[child: null]])
    <?xml version="1.0" encoding="US-ASCII"?>
    <parent>
       <child age="1" name="Child"/>
    </parent>