5

问候!我有一个服务器将 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 缺失异常)。

有什么智慧可以传授吗?这不可能那么难,对吧?

4

3 回答 3

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

这将解组 XML <string xmlns="blah">foobar</string>。相应地更改命名空间。如果您有很多名称空间,那么 JAXB 并不是真正适合您的工具。

于 2009-10-17T05:38:59.907 回答
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();

那是你要找的吗?

于 2009-10-17T14:19:22.970 回答
3

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

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

于 2009-10-17T04:11:15.223 回答