问候!我有一台服务器将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实际上并不适合您.
我对此感到惊讶,但以下似乎有效:
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)
那是你在找什么?
当您使用 JAXB 时,您需要围绕 XML 模式构建代码。也就是说,如果您有一个文件,例如 foo.xsd,您需要通过 xjc 编译器运行它(默认情况下在 JDK 6 中,否则您可以下载 JAXB 2 并使用它)。这将读取模式并生成 Java bean 以及与模式中的元素关联的 ObjectFactory 类。Java bean 类看起来就像带有注释的常规 POJO。JAXB 实现需要 ObjectFactory 类将 XML 转换为相应的 Java bean。这解释了您的 ObjectFactory 缺失异常。
所以这并不难,但涉及一些跑腿工作。我们将它用于我们的生产应用程序之一,它非常棒。现在我发现自己更多地使用它,因为它是 JDK 的一部分。
| 归档时间: |
|
| 查看次数: |
16094 次 |
| 最近记录: |