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

根据2个XSD验证XML

胡曾笑
2023-03-14

我正在尝试使用SAX解析和验证SOAP请求。需要两个XSD,一个用于SOAP信封(http://schemas.xmlsoap.org/soap/envelope/),另一个用于我定义的。我找不到针对这两个XSD正确验证请求的方法。

下面是我用来解析请求并根据soapenv验证它的代码。xsd。它工作得很好。如果改为指定XSD,验证将失败,并显示“找不到元素‘soapenv:Envelope’的声明”。

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);

SAXParser saxParser = factory.newSAXParser();       
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", MyClass.class.getResourceAsStream("/xml/soapenv.xsd"));

InputSource is = new InputSource(MyClass.class.getResourceAsStream("/xml/request.xml"));
XMLReader reader = saxParser.getXMLReader();
reader.setContentHandler(new MyHandler());
reader.setErrorHandler(new MyErrorHandler());
reader.parse(is);

如何指定第二个XSD?

有没有更好的方法来解析和验证SOAP请求?

编辑

按照提议,我创建了第三十个。导入我的两个xsd的xsd。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="thirdparty:general"
xmlns="thirdparty:general"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:import schemaLocation="D:\ucfed\ValidateWSDL\src\xml\soapenv.xsd" 
       namespace="http://schemas.xmlsoap.org/soap/envelope/"/>

    <xs:import schemaLocation="D:\ucfed\ValidateWSDL\src\xml\Presence.xsd" 
       namespace="thirdparty:presence"/>    
</xs:schema>

我指定此新XSD用于验证:

saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", MyClass.class.getResourceAsStream("/xml/thidpty.xsd"));

但仍然只有SOAP信封XSD用于验证。如果修改另一个XSD中的一个元素,验证不会检测到它。

下面是我尝试验证的xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="thirdparty:presence">
    <soapenv:Header/>
    <soapenv:Body>
        <urn:getPresenceQuery>
            <urn:origAccount uri="test@origin.com"/>
            <urn:destAccount uri="test@destination.com"/>
        </urn:getPresenceQuery>
    </soapenv:Body>
</soapenv:Envelope>

其他想法?

共有1个答案

淳于坚壁
2023-03-14

编写一个驱动程序模式文档,导入其他两个;针对驱动程序进行验证。

 类似资料:
  • 谁能解释一下如何使用notepad++根据XSD验证xml文件。“XML Tools”插件下拉列表中没有提供指定XSD文件的选项。在plugins子目录中正确安装XML插件,并将3个DLL复制到notepad++EXE子目录。其他XML“验证”特性也可以工作,但无法针对XSD进行验证。

  • 问题内容: 我正在生成一些XML模式,并希望确保我们的生成器正在创建有效的XML模式文档(不是XML)。我试图提出验证XML Schema文档的代码,但失败了。我不认为会这么复杂。 这段代码与我需要做的非常接近,但是出现以下错误。 我在调用setSchema(uri)时使用URL,以确保XMLSchema.dtd和datatypes.dtd是相对的,希望它们可用,但是我不确定如何进行检查。 我猜想

  • 我试图在Java验证XSD1.1中的XML。正如所讨论的,如何在Java根据XSD1.1验证XML? 我有个例外说: java.lang.IllegalArgumentException:无法加载实现http://www.w3.org/xml/xmlschema/v1.1指定的架构语言的SchemaFactory 然后我尝试,错误是: 无法从类型SchemaFactory对非静态方法setProp

  • 我在验证xml和xsd时遇到问题。我从xsd模式中得到这个错误。 src解决方案。4.2:解析组件“urn:id”时出错。检测到“urn:id”位于命名空间“urn:schemas microsoft com:xml-diffgram-v1”中,但此命名空间中的组件无法从架构文档中引用virtual://server/schema.xsd。如果名称空间不正确,可能需要更改“urn:id”的前缀。如

  • 问题内容: 我需要使用给定的XSD文件验证XML文件。我只需要如果验证正常就返回true,否则返回false的方法。 问题答案: 仅返回true或false(也不需要任何外部库):

  • 我正在创建一个XML验证器,它将根据特定的模式验证XML。我当前正在使用OASIS模式验证针对该模式的断言。下面是模式,当它被传递给SchemaFactory并且模式对象被创建时,xenc:encryptedData元素未被解析,该元素存在于导入的模式xenc-schema.xsd中。“ 并且当我创建SchemaFactory的实例并尝试加载模式时,它无法定位在上述模式中导入的模式: 当创建模式对