问候!我有一台服务器将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缺少异常)。
传授任何智慧?这不是那么难,对吧?
答案 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的一部分。