JaxB:是否建议使用JAXB从非webservice项目中的xml获取java对象

时间:2014-04-09 03:17:48

标签: java xml web-services jaxb xsd

我正在尝试使用SAX和DOM解析器解析我的巨型xml。 DOM解析器占用大量内存,并且SAX parseh的实现让我用它们的名字检查一些嵌套标签,花费大量时间并且看起来效率不高。

我使用JAXB解析了xml并创建了它的java对象,我从getter获取值。(这些类是使用我的xml文件的XSD生成的)

JAXBContext jaxbContext = JAXBContext.newInstance(Myclass.class);
 Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

InputStream in = new ByteArrayInputStream(xmldata.getBytes());  Myclass classobject =(Myclass)jaxbUnmarshaller.unmarshal(in);

classobject正在给我想要的东西。

我的项目不是webservice项目。所以我的问题是:是否建议使用JAXB for Java Projects?我在技术上也不解析xml(JAXB附带DOM和SAX),所以解析是不是在解析?

3 个答案:

答案 0 :(得分:1)

有些人非常热衷于数据绑定(JAXB),并且有些人非常不愿意使用它。根据我的经验,当数据结构高度且结构非常稳定时,它运行良好;如果词汇量很大,如果它包含混合内容,或者它每两个月都会发生变化,那就太噩梦了。我没有任何使用非常大的数据集的经验。我个人倾向于尽可能使用基于XML的处理语言(即XSLT和XQuery)处理XML数据,而不是使用不太适合XML数据模型的Java等语言。

答案 1 :(得分:1)

是的.JAXB可以(并且经常)在Java SE中用于非Web服务应用程序。它包含在Java SE 6中。

适合您的正确XML处理器(DOM,SAX,StAX,JAXB,XPath等)取决于您要构建的内容。此外,它不需要是“任何一个”或“选择”,因为许多这些API旨在协同工作。

答案 2 :(得分:0)

还有其他选择。如果您对首先将XML转换为静态类型结构不感兴趣(并且您可以打击工程师,告诉您这是编写Java的唯一方法),您可以尝试动态方法。

即Java 8库Dynamics

XmlDynamic example = new XmlDynamic("<products>" +
    "<product name=\"some product\">" +
      "<created>2012-04-02T12:34</created>" +
    "</product>" +
    "<product name=\"some newer product\">" +
      "<created>2016-01-02T00:03:45.234Z</created>" +
    "</product>" +
  "</products>");

String firstProductName = example.get("products|product|@name").asString();
// "some product"

ZonedDateTime secondProductCreation = example.get("products|product[1]|created")
    .convert().intoZonedDateTime();
// java.time.ZonedDateTime 2016-01-02T00:03:45.234Z

使用动态数据(xml)时,使用动态概念有时会带来好处。安全无瑕,流畅的铸造和安全转换和描述性错误消息也非常有用。