1

我是 xml 解析的新手。我使用 DOM 来解析 xml 以供练习。现在我想将一些移动到其他 xml 解析框架。所以我选择了 JAXB 解析器。对于我的要求,我无法为所有 xml 标签创建 getter setter。因为我将得到的 xml 是动态的。所以我事先不知道创建getter/setter的标签。我参考了这个链接http://www.mkyong.com/java/jaxb-hello-world-example/。有什么方法可以在不创建 getter 和 setter 的情况下进行解析。请让我清楚。

4

4 回答 4

1

对于 JAXB,您应该为可能动态获取的所有 XML 标记创建变量和相应的 getter 和 setter。如果您有一个标签(您可以动态获取)但在 Java 类中没有相应的映射变量,那么您将获得 JAXB 异常。

因此,您可以在 JAXB Java 类中定义一个标签,但在请求中进行,但相反,未在 JAXB 类中定义但在 XML 中定义的标签会给您一个例外。

于 2013-01-11T05:54:53.963 回答
1

您可以利用@XmlAnyElementXmlAnyAttribute注释来映射额外的内容。如果您不想要get/set方法,只需添加@XmlAccessorType(XmlAccessType.FIELD)您的课程。

顾客

在下面的类中,我们映射一个特定的 XML 属性和元素,然后使用@XmlAnyElement注解来映射可能出现的任何其他元素,并@XmlAnyAttribute映射可能出现的任何其他属性。

import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    @XmlAttribute
    int id;

    @XmlAnyAttribute
    Map<QName, String> otherAttributes;

    String name;

    @XmlAnyElement(lax=true)
    List<Object> otherElements;

}

输入.xml

我们将在演示代码中解组以下 XML 文档。

<?xml version="1.0" encoding="UTF-8"?>
<customer id="123" status="good">
    <name>Jane Doe</name>
    <address>
        <street>1 A Street</street>
        <city>Any Town</city>
    </address>
    <phone-number>555-1111</phone-number>
</customer>

演示

以下文档将解组 XML 输入,将所有生成的对象内容转储System.out到 XML 并将对象编组回 XML。

import java.io.File;
import java.util.Map.Entry;
import javax.xml.bind.*;
import javax.xml.namespace.QName;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14272453/input.xml");
        Customer customer  = (Customer) unmarshaller.unmarshal(xml);


        // Mapped XML Attribute
        System.out.println("customer.id");
        System.out.println("    " + customer.id);

        // Other XML Attributes
        System.out.println("customer.otherAttributes");
        for(Entry<QName, String> entry : customer.otherAttributes.entrySet()) {
            System.out.println("    " + entry);
        }

        // Mapped XML Element
        System.out.println("customer.name");
        System.out.println("    " + customer.name);

        // Other XML Elements
        System.out.println(customer.otherElements);
        for(Object object : customer.otherElements) {
            System.out.println("    " + object);
        }

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

}

输出

下面是运行演示代码的输出,请注意所有字段是如何使用 XML 文档中的数据填充的。

customer.id
    123
customer.otherAttributes
    status=good
customer.name
    Jane Doe
customer.otherElements
    forum14272453.Address@24f454e4
    [phone-number: null]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="123" status="good">
    <name>Jane Doe</name>
    <address>
        <street>1 A Street</street>
        <city>Any Town</city>
    </address>
    <phone-number>555-1111</phone-number>
</customer>

了解更多信息

于 2013-01-11T11:05:52.743 回答
0

这将是动态的。解组调用 Customer.setElements;元帅调用 Customer.getElements

@XmlRootElement
class Customer {
    @XmlAnyElement
    public void setElements(List<Element> list) {
        for (Element e : list) {
            String name = e.getNodeName();
            String value = e.getTextContent();
        }
    }

    public List<Element> getElements() throws ParserConfigurationException {
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        List<Element> list = new ArrayList<>();
        Element e = doc.createElement("e1");
        e.setTextContent("v1");
        list.add(e);
        return list;
    }
}
于 2013-01-11T06:29:22.180 回答
-1

Jackson以其 JSON 处理器而闻名,它也支持 XML 解析,并且它在反射方面做得很好,因此即使没有 getter 和 setter 也可以进行解析。试试看。

于 2013-01-11T05:52:48.547 回答