Java 使用过时的XSD解析XML
我正在一个大型企业平台上集成,供应商喜欢频繁更新其XML格式,尽管他们承诺更改将继续向后兼容。我有一个可以工作的XSD…现在…但我想用我们的应用程序代码部署该模式,而不必为每个web服务更新重新部署。作为另一个推动力,基于JVM的XSD类型导入非常好 作为一种退路,我可以使用XPath查询提取特定元素,但这要难得多 如何针对过时但未过时的模式文件继续解析不断发展的XML?Java 使用过时的XSD解析XML,java,xml,parsing,xsd,gosu,Java,Xml,Parsing,Xsd,Gosu,我正在一个大型企业平台上集成,供应商喜欢频繁更新其XML格式,尽管他们承诺更改将继续向后兼容。我有一个可以工作的XSD…现在…但我想用我们的应用程序代码部署该模式,而不必为每个web服务更新重新部署。作为另一个推动力,基于JVM的XSD类型导入非常好 作为一种退路,我可以使用XPath查询提取特定元素,但这要难得多 如何针对过时但未过时的模式文件继续解析不断发展的XML? 我正在寻找像“松散解析”选项或“忽略未知标记”这样的东西,它们可以让我访问文档中应用程序当前知道和关心的部分。任何新标记都可
我正在寻找像“松散解析”选项或“忽略未知标记”这样的东西,它们可以让我访问文档中应用程序当前知道和关心的部分。任何新标记都可以被丢弃——从业务的角度来看,它们是不相关的。这是JAXB Java Architecture for XML Binding的默认行为,它是定义Java对象如何从XML转换为XML的Java标准 如果您从其他人提供的XSD开始,那么可以使用JDK附带的xjc工具生成类
> xjc vendor.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中而不删除,就不会有问题
上面的代码片段就是根据这一点改编的。这是JAXB Java Architecture for XML Binding的默认行为,它是定义Java对象如何从XML转换为XML的Java标准 如果您从其他人提供的XSD开始,那么可以使用JDK附带的xjc工具生成类
> xjc vendor.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中而不删除,就不会有问题
上面的代码片段是根据此改编的。Shining表示这是内置的。Shining表示这是内置的。