Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用过时的XSD解析XML_Java_Xml_Parsing_Xsd_Gosu - Fatal编程技术网

Java 使用过时的XSD解析XML

Java 使用过时的XSD解析XML,java,xml,parsing,xsd,gosu,Java,Xml,Parsing,Xsd,Gosu,我正在一个大型企业平台上集成,供应商喜欢频繁更新其XML格式,尽管他们承诺更改将继续向后兼容。我有一个可以工作的XSD…现在…但我想用我们的应用程序代码部署该模式,而不必为每个web服务更新重新部署。作为另一个推动力,基于JVM的XSD类型导入非常好 作为一种退路,我可以使用XPath查询提取特定元素,但这要难得多 如何针对过时但未过时的模式文件继续解析不断发展的XML? 我正在寻找像“松散解析”选项或“忽略未知标记”这样的东西,它们可以让我访问文档中应用程序当前知道和关心的部分。任何新标记都可

我正在一个大型企业平台上集成,供应商喜欢频繁更新其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表示这是内置的。