我正在尝试使用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),所以解析是不是在解析?
答案 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)时,使用动态概念有时会带来好处。安全无瑕,流畅的铸造和安全转换和描述性错误消息也非常有用。