【问题标题】:How to get a value between tags with XML format using jaxb如何使用 jaxb 在 XML 格式的标签之间获取值
【发布时间】:2018-05-22 14:11:55
【问题描述】:

我有一个如下的xml格式:

<list>12
    <item name="a">
        <child parent="b" age="1">David Beckham</child>
    </item>
</list>

问题是如何使用 JAXB 提取 12?哪个注解支持它?非常感谢。

【问题讨论】:

  • 我认为这是不可能的。通常你会使用@XmlValue注解获取内部文本,使用@XmlElement注解获取item元素。然而,这两个注释是不兼容的。在同一个类中同时使用它们会产生 JAXB 错误。
  • 感谢您的回答,您是对的。如果我将列表标记声明为带有注释 @XmlElement 的变量,我可以获得该值。但我也喜欢在列表标签​​内吸引项目对象。那么我们有什么办法可以解决这个问题呢?
  • @AhmadShahwan:我可以问更多问题吗?是上面正确的xml格式吗?
  • 可能正在使用@XmlAdapter。请查看here
  • 这是一个有效的 XML。

标签: java xml annotations jaxb


【解决方案1】:

以下是工作示例。

import java.io.StringReader;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementRefs;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;
import javax.xml.transform.stream.StreamSource;

public class TestJAXBMixed {

    public static void main(String[] args) throws Exception {
        final String str = 
            "<list>12<item name=\"a\"><child parent=\"b\" age=\"1\">David Beckham</child></item></list>";
        final JAXBContext jaxbContext = JAXBContext.newInstance(Child.class, Item.class, ListElement.class);
        final JAXBElement<ListElement> obj = jaxbContext.createUnmarshaller().unmarshal(new StreamSource(new StringReader(str)), ListElement.class);
        // The following is an array of objects representing the <list> content in order, 
        // i.e. it is a sequence of a String (12) and an Object (Item)
        final List<Object> content = obj.getValue().getContent();
        System.out.println(content);
    }

}

@XmlRootElement(name="child")
class Child {

    private String parent;
    private String age;
    private String text;

    public String getParent() {
        return parent;
    }

    @XmlAttribute(name="parent")
    public void setParent(String parent) {
        this.parent = parent;
    }

    public String getAge() {
        return age;
    }

    @XmlAttribute(name="age")
    public void setAge(String age) {
        this.age = age;
    }

    public String getText() {
        return text;
    }

    @XmlValue
    public void setText(String text) {
        this.text = text;
    }
}

@XmlRootElement(name="item")
class Item {

    private String name;
    private Child child;

    public String getName() {
        return name;
    }

    @XmlAttribute(name="name")
    public void setName(String name) {
        this.name = name;
    }

    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }
}

@XmlRootElement(name="list")
class ListElement {

    private List<Object> content;

    public List<Object> getContent() {
        return content;
    }

    @XmlMixed
    @XmlElementRefs({
        @XmlElementRef(name="item", type=Item.class)
    })
    public void setContent(List<Object> content) {
        this.content = content;
    }
}

【讨论】:

    【解决方案2】:

    SimpleXml 可以做到:

     final String data = ...
     final SimpleXml simple = new SimpleXml();
     final Element element = simple.fromXml(data);
     System.out.println(element.text);
    

    将输出:

    12
    

    来自 Maven 中心:

    <dependency>
        <groupId>com.github.codemonstur</groupId>
        <artifactId>simplexml</artifactId>
        <version>1.4.0</version>
    </dependency>
    

    【讨论】:

    • 其实我已经解决了这个问题,但是很高兴知道另一种方法,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多