当前位置: 首页 > 知识库问答 >
问题:

使用过时的XSD解析XML

莘睿
2023-03-14

我正在一个大型企业平台上集成,供应商喜欢频繁更新其XML格式,尽管他们promise更改将继续向后兼容。我有一个可以工作的XSD…现在…但我想用我们的应用程序代码部署该模式,而不必为每个web服务更新重新部署。作为另一个推动力,(基于JVM的)配置语言具有非常好的XSD类型导入。

作为一种后备方法,我可以使用XPath查询提取特定元素,但这就不那么令人愉快了。

  • 如何继续针对已过时但未过时的架构文件解析不断发展的 XML?

我正在寻找像“松散解析”选项或“忽略未知标签”这样的东西,它可以让我访问我们的应用程序当前知道和关心的文档部分。任何新标签都可以丢弃——从业务的角度来看,它们是无关紧要的。

共有1个答案

朱阳晖
2023-03-14

这是JAXB(Java Architecture for XML Binding)的默认行为,JAXB是定义Java对象如何与XML相互转换的Java标准。

如果您从其他人提供的XSD开始,您可以使用JDK附带的xjc工具生成类。

> xjc vendor.xsd

查看如何从xsd生成jaxb类

默认情况下,这将创建一个“生成”的类包,表示XSD中定义的元素。如果XML的顶部元素是VdorDocument,则以下代码将允许您使用输入文件:

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"));

  }
}

您将看到,如果向供应商.xml输入文件添加额外的标记和属性,则它们将被忽略,您可以继续获取所需的文档部分。只要将来只将内容添加到 XSD 中,而不删除,您就不应该有问题。

上面的代码片段改编自本教程。

 类似资料:
  • 当xjc解析followinf xsd时,我得到了“Prolog中的错误” 我已经检查了xsd的有效性,没有发现任何错误。开始前没有字符也。。。

  • 我一直在尝试解析xsd文件,以便能够在本地生成jaxb文件。为了做到这一点,我在linux上使用了命令,而不使用命令本身的任何选项。 但即使是我也非常基本地使用它: 它给出了一个错误,如下所示: 错误发生定义见下文第11行。 即使我一直在使用的xsd模式也是一个非常通用和正式的模式,它会给出上面看到的错误。因为它是默认模式,不应该被改变,我不知道我需要做什么... 在一些轮胎之后,我还尝试使用中的

  • 我正在使用xjc解析以下xsd 我收到错误:记录原因:cvc datatypevalid。1.2.1:'xsi:schemaLocation'不是'NCName'的有效值。

  • 当我试图在没有internet连接的情况下启动tomcat时,在解析catalina_home/conf/web.xml中的web.xml时会抛出一个错误。(CATALINA_HOME在我的环境中是/usr/share/tomcat8.5) 我已经确定问题是它试图获取位于http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd的xsd文件,但是由于它处于

  • 亲爱的Antlr4社区, 解析似乎很顺利: 但是,我得到以下错误消息: 错误是: [1]交换量子精确和正态分布的定义。但是交换在第一个输入中引入了一个错误: 因为在这种情况下,'6'只被视为一个正态分布,而不是一个全精确值。 [2]尝试为Quanteact(数量的花括号)创建一个上下文,这样lexer只在这个有限的上下文中提供Quanteact符号。但是我没有为此找到ANTLR4原语。 所以似乎什

  • 我正在用XSD验证xml文档。通过使用sax解析器,它成功地验证了。但是当我们使用DOM解析器时,它给出的错误是“Validator class:com.sun.org.apache.xerces.internal.jaxp.validation.validatorImpl org.xml.sax.SAXParseException;CVC-ELT.1:找不到元素“diagram”的声明。“ nu