JAXB解组<string> foobar </string>

时间:2009-10-17 03:02:11

标签: java jaxb unmarshalling

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

<string xmlns="...">foobar</string>

我是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();
    }

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

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

3 个答案:

答案 0 :(得分:10)

您需要编写符合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(...);

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

答案 1 :(得分:7)

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

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();

那是你在找什么?

答案 2 :(得分:3)

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

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

相关问题