我们有一个导入XML文件的系统,根据xsd进行检查然后进行处理。
现在我们有一个案例,我们希望以这种方式传输任何对象。即Java对象被序列化为XML,稍后导入,根据xsd进行检查并进行处理。
由于我们事先不知道对象的确切外观,我们希望使用非常通用的xsd,并且只检查XML格式是否完好但不是特定节点左右。
我尝试找到这样一般的XSD,但我找到的只是网站会为你检查身体状况,而我需要一个类似检查的xsd。
有谁知道这样的XSD?或者我该如何创建它。理想情况下会说:
“XML有一个标题和一个数据区。标题区域是结构化内容,我知道如何描述该部分。数据区域可以是任何东西。我不关心它是什么,我只是接受它,如果它是XML 。“
如果我找不到接受这种非特定内容的xsd,我会在这种情况下恢复跳过xsd验证,但这将是一个尴尬的解决方案,因为我必须改变一个完善的通用导入函数,我希望我不需要碰。
答案 0 :(得分:2)
是的,您可以使用XSD验证程序检查格式良好或仅部分文档的有效性。
正如其他人所指出的那样,如果你真的想要只检查结构良好,那么根本不需要XSD验证步骤。
但它说这里说你不能使用XSD验证步骤来检查格式良好是错误的:你需要的只是一个基本上空洞的架构和一个你可以在“验证”中调用的验证器。 ; mode(它基本上验证了匹配声明的元素和属性 - 在一个空的模式中,没有找到)。因为任何普通的XSD验证器都会解析XML,如果你把它交给XML(而不是DOM对象),那么良好的格式就会被检查为副作用。 (当然,有可能争辩说,在这种情况下,格式良好的检查并不是 XSD验证过程的一部分,只是它的必要伴随。我是其中的一员。喜欢这种诡计的人;我不会觉得你关心这种区别。)
但实际上你说你知道如何描述(因此,我想,验证)标题区域,它只是应该不受约束的有效载荷区域。为此,您需要大致以下形式的架构。它的基本思想与asmith1024提供的草图非常相似,只是该模式对其objects
元素使用显式通配符,而这个仅依赖于xs的默认类型:anyType;一个结果是,这个tns:payload
元素将接受字符数据作为内容,而objects
元素则不会。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://example.com/nss/target"
xmlns:tns="http://example.com/nss/target">
<!--* a message contains a header and
* a payload. *-->
<xs:complexType name="message">
<xs:sequence>
<xs:element ref="tns:header"/>
<xs:element ref="tns:payload"/>
</xs:sequence>
</xs:complexType>
<xs:element name="message" type="tns:message"/>
<!--* a header has a defined structure
* (to be specified ...) *-->
<xs:element name="header">
<!--* ... your definition of header
* validity here ... *-->
</xs:element>
<!--* other types and elements used in
* header ... *-->
<!--* A payload has NO defined structure. *-->
<!--* no definition of any type for payload,
* so it defaults to xs:anyType, and
* can contain ... any well-formed XML
* content. *-->
<xs:element name="payload"/>
答案 1 :(得分:1)
您可以尝试这样的事情:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://test.any.org"
xmlns="http://test.any.org"
elementFormDefault="qualified">
<xs:element name="objects">
<xs:complexType nillable="true">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
您对此所说的是,如果任何格式良好的XML包含在{http://test.any.org}个对象元素中,则它是有效的。
这将处理一个空列表:
<objects xmlns="http://test.any.org"/>
空列表:
<objects xmlns="http://test.any.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
来自任何命名空间(或无)的异构对象列表:
<any:objects
xmlns:any="http://test.any.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<objectA type="someType" value="someValue"/>
<objectB xmlns="http://some.external.schema" xsi:nil="true"/>
<any2:objectC
xmlns:any2="http://another.external.schema"
xmlns:any3="http://some.funky.attribute">
<any2:type any3:attr1="hello">Some Type</any2:type>
<any2:value any3:attr2="whoops">Some Value</any2:value>
</any2:objectC>
</any:objects>
当然,如果你收到一个没有对象元素作为其根目录的文档,你将不得不首先将它包含在一个文件中。
答案 2 :(得分:0)
不,你不能这样做。验证XML解析器需要将输入XML文档的根元素与模式中的元素声明进行匹配。如果无法做到这一点,那么vaildation当然会失败。
但是没有什么可以阻止你根据模式验证已知的内容,只检查&#34;良好的形成&#34;反对未知内容。
答案 3 :(得分:0)
XSD无法检查XML是 格式正确 。 XSD只能用于检查XML 有效 。任何XML解析器都将报告XML文档是否格式正确;不需要XSD。
有关格式良好和有效之间的区别,请参阅 Well-formed vs Valid XML 。
对于非常通用的XSD,请参阅 XML Schema that allows anything (xsd:any) 。
* ...unless you have a means of creating a vacuous XSD and invoking validation in lax mode。