JAXB解组<string> foobar </ string>

5 java jaxb unmarshalling

问候!我有一台服务器将XML内容返回给我的客户端,如下所示:

<string xmlns="...">foobar</string>
Run Code Online (Sandbox Code Playgroud)

我是JAXB的新手并且已经有很多工作,除了这个.我认为从字符串中编组和解组这个很容易.花了一段时间,但我终于想出了如何编组这个

    public static String ToXML(String s) throws Exception
    {
        JAXBContext context = JAXBContext.newInstance(String.class);
        Marshaller marshaller = context.createMarshaller();
        StringWriter sw = new StringWriter();
        marshaller.marshal(new JAXBElement(new QName("", "String"), String.class, s), sw);

        return sw.toString();
    }
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如何解组呢?它不能被注释为根元素.我不能使用java.lang作为包来创建JAXBContext的新实例(我得到一个ObjectFactory缺少异常).

传授任何智慧?这不是那么难,对吧?

ska*_*man 11

您需要编写符合XML结构的对象模型,并告诉JAXB解组.您的示例可能看起来很简单,但它不是JAXB的用途.

尝试这样的事情:

@XmlRootElement(name="string", namespace="blah")
public class MyString {
   @XmlValue
   String value;
}

JAXBContext context = JAXBContext.newInstance(MyString.class);
MyString myString = (MyString) context.createUnmarshaller().unmarshal(...);
Run Code Online (Sandbox Code Playgroud)

这将解组XML <string xmlns="blah">foobar</string>.相应地更改名称空间.如果您有许多名称空间,那么JAXB实际上并不适合您.


laz*_*laz 8

我对此感到惊讶,但以下似乎有效:

final String xmlString = "<string>value</string>";
final StringReader xmlReader = new StringReader(xmlString);
final StreamSource xmlSource = new StreamSource(xmlReader);
final JAXBContext jaxbContext = JAXBContext.newInstance(String.class);
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
final String stringValue = unmarshaller.unmarshal(xmlSource, String.class).getValue();
Run Code Online (Sandbox Code Playgroud)

那是你在找什么?


And*_*rna 3

当您使用 JAXB 时,您需要围绕 XML 模式构建代码。也就是说,如果您有一个文件,例如 foo.xsd,您需要通过 xjc 编译器运行它(默认情况下在 JDK 6 中,否则您可以下载 JAXB 2 并使用它)。这将读取模式并生成 Java bean 以及与模式中的元素关联的 ObjectFactory 类。Java bean 类看起来就像带有注释的常规 POJO。JAXB 实现需要 ObjectFactory 类将 XML 转换为相应的 Java bean。这解释了您的 ObjectFactory 缺失异常。

所以这并不难,但涉及一些跑腿工作。我们将它用于我们的生产应用程序之一,它非常棒。现在我发现自己更多地使用它,因为它是 JDK 的一部分。