【问题标题】:Validate a subset of or only certain elements of an XML document?验证 XML 文档的子集或仅验证 XML 文档的某些元素?
【发布时间】:2010-12-22 00:23:48
【问题描述】:

我有这个 XML 文件(其中一些是巨大的 - 数千个元素),我正在尝试使用 XSD 模式验证这个 XML 文件的某些元素。例如。日期等。现在,问题是 XSD 不允许我仅验证文档的某些部分。它想要对所有事物进行定义——那将是相当痛苦的。我想知道的是,有没有办法让 XSD 只处理文档的某些元素?我试过 any 和 anyAttribute 无济于事。如果没有,你会怎么做?是否有一个库/脚本可以生成与 XML 文档相对应的模式,然后我可以根据需要对其进行修改?

谢谢,

【问题讨论】:

  • XSD 想要所有东西的定义是什么意思?你怎么知道的?你在说什么“XSD”? “XSD”“想要定义”是什么意思?
  • 您可能希望显示用于验证的代码。如何完成这项任务可能取决于您使用的工具——通常是这样。
  • 抱歉不清楚。我有一个架构文件,并且正在尝试针对该架构验证 XML 文档。架构文件仅对我要验证的某些元素具有限制和类型设置。当我使用 XML::LibXML::Schema 验证此架构文件时,我收到有关文件中未定义的其他元素的错误。希望这是有道理的。

标签: xml perl validation xsd


【解决方案1】:

你也有 <xs:element name="aName"/> 匹配你的类型,所以任何类型。

典型的部分验证是:

<xs:schema>
 <xs:element name="theRootElement">
  <xs:complexType>
   <xs:sequence>
    <!- some wildcard wich match the beginning of the document until the desired element -->
    <xs:any processContent="skip" namespace="somethingOrAll"/>

    <xs:element name="theDesiredElementToMatch">
     <!-- the matching test -->
    </xs:element>

    <!-- the rest of the doc -->
    <xs:any processContent="skip" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

但它并不适用于所有模式,而且非常乏味。

【讨论】:

    【解决方案2】:

    复制您关心的部分以记录片段 DOM 并针对它们运行验证。当然,假设您正在使用 API 对某种语言进行编程。

    【讨论】:

    • 我正在使用Perl,所以我确信它可以完成。但是,我正在处理许多不同类型的文档(用户、订单等),并且为每种不同类型的文档使用不同的子例程来仅验证某些部分似乎是不必要的(维护地狱!)。将这些字段包含在架构中,然后在我们需要验证更多字段时继续向架构中添加更多字段会很棒。
    • 它可能很棒,但它不是 XML Schema 的一个特性。你可以试试 Relaxng 之类的。
    • 是的,目前,很多 processContent="skip"&lt;xs:any&gt;&lt;xs:anyAttributes&gt; 似乎都在做这项工作。不过,我愿意接受更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多