【问题标题】:Parse XML with an outdated XSD使用过时的 XSD 解析 XML
【发布时间】:2014-05-13 23:19:53
【问题描述】:
我正在一个大型企业平台上进行集成,供应商喜欢经常更新他们的 XML 格式,尽管他们已承诺更改将继续向后兼容。我有一个可以工作的 XSD……现在……但我想用我们的应用程序代码部署该架构,而不必为每个 Web 服务更新重新部署。作为额外的动力,(基于 JVM)configuration language 具有非常不错的 XSD 类型导入。
作为后备方案,我可以使用 XPath 查询提取特定元素,但这并不那么令人愉快。
- 如何继续针对过时但还没有过时的架构文件解析不断发展的 XML?
我正在寻找诸如“松散解析”选项或“忽略未知标签”之类的东西,它们可以让我访问我们的应用程序当前知道和关心的文档部分。任何新标签都可以丢弃 - 从业务角度来看,它们是无关紧要的。
【问题讨论】:
标签:
java
xml
parsing
xsd
gosu
【解决方案1】:
这是 JAXB(用于 XML 绑定的 Java 体系结构)的默认行为,它是用于定义 Java 对象如何从 XML 转换为 XML 的 Java 标准。
如果你是从别人提供的 XSD 开始,你可以使用 JDK 自带的 xjc 工具生成类。
> xjc vendor.xsd
见how-to-generate-jaxb-classes-from-xsd
默认情况下,这将创建一个“生成”的类包,代表 XSD 中定义的元素。如果 XML 的顶部元素是 VendorDocument,则以下代码将让您使用输入文件:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import generated.VendorDocument;
public class VendorMain {
public static void main(String[] args) throws JAXBException, IOException {
// create JAXB context
JAXBContext context = JAXBContext.newInstance(VendorDocument.class);
// unmarshal document from file
Unmarshaller um = context.createUnmarshaller();
VendorDocument vendorDoc = (VendorDocument) um.unmarshal(new FileReader("vendor.xml"));
//Check what got read in by writing it out. Will not have unknown tags.
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(vendorDoc, new File("output.xml"));
}
}
您会看到,如果您向 vendor.xml 输入文件添加额外的标签和属性,它们就会被忽略,您可以继续访问您需要的文档部分。只要将来只是将内容添加到 XSD 而不是删除,就没有问题。
上面的代码sn-p改编自这个tutorial。