【问题标题】:XML Schema: Different Element Names (sequence)XML 模式:不同的元素名称(序列)
【发布时间】:2009-08-19 12:28:15
【问题描述】:

我认为我的问题的解决方案很简单,但我找不到它 所以,这里是:

我有一个 XML,它有一个具有不同名称但按顺序排列的元素列表。 一个例子:

<DOC>
 <DOC_OBL_1>
  <TIP_DOC_OBL>1</TIP_DOC_OBL> 
 </DOC_OBL_1>
 <DOC_OBL_2>
  <TIP_DOC_OBL>2</TIP_DOC_OBL> 
 </DOC_OBL_2>
 <DOC_OBL_3>
  <TIP_DOC_OBL>3</TIP_DOC_OBL>  
 </DOC_OBL_3>
</DOC>

所以,我有 3 个元素:DOC_OBL_1、DOC_OBL_2 和 DOC_OBL_3。是的,可能有 4、5、6 等。 正如你所看到的,所有 3 个内部都有相同的元素(实际上,它们有很多,但现在并不重要),我想我可以声明一个可以验证此类文档的通用类型。

如何使用 Schema 验证这一点???

我知道它是一个非常丑陋的 XML(也许它不是标准的,请告诉我,我不知道),但是我不关心构建这个文档。我只需要对其进行解析、验证和转换。

【问题讨论】:

    标签: xml xsd schema w3c-validation


    【解决方案1】:

    嗯,当然可以!实际上非常简单:如果每个元素的结构相同,您可以定义一个 &lt;xs:complexType&gt; 来验证它,然后使用:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="DOC" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="DOC">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="DOC_OBL_1" type="DocType" />
            <xs:element name="DOC_OBL_2" type="DocType" />
            <xs:element name="DOC_OBL_3" type="DocType" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:complexType name="DocType">
        <xs:sequence>
          <xs:element name="TIP_DOC_OBL" type="xs:string" minOccurs="0" />
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    

    这对你有用吗?它可以满足您的所有需求吗?

    正如 Zach 非常正确地指出的那样——这个“解决方案”显然是相当有限的,因为它不能处理任意数量的标签 DOC_OBL_1、DOC_OBL_2、....、DOC_OBL_x——名称以及标签的数量必须提前知道。

    这很不幸,但考虑到这个残缺的 XML,这是唯一的解决方案。 REAL 解决方案是:

    <DOC>
      <DOC_OBL id="1">
      </DOC_OBL>
      <DOC_OBL id="2">
      </DOC_OBL>
      .....
      <DOC_OBL id="x">
      </DOC_OBL>
    </DOC>
    

    然后 XML 模式会变得更加简单,可以处理任意数量的&lt;DOC_OBL&gt; 标签。

    但是 GIGO 原则适用:Garbage In, Garbage Out ==> 糟糕的 XML 结构进来了,只有糟糕的、不完整的验证是可能的。

    马克

    【讨论】:

    • @marc_s 如果可能有任意数量的 DOC_OBL_1、DOC_OBL_2、DOC_OBL_N 节点,有没有办法针对元素名称执行某种正则表达式来验证模式?
    • 不,很遗憾,这是不可能的,恐怕。您只能将实际标签名称作为元素名称,或者您必须在该标签的属性中具有固定标签名称和可变部分(序号)。
    • 谢谢。我想我会用至少 50 个元素(DOC_OBL_1 ... DOC_OBL_50)来做到这一点。丑陋的输入 -> 丑陋的解决方案.. :D 但无论如何它都可以工作。
    【解决方案2】:

    不幸的是,xml 元素名称中基本上包含序列号/标识符。我会说这是定义不明确(非标准)的 XML。

    根据我有限的 (!) 经验,这意味着 xsd 模式必须在序列中定义所有可能的“DOC_OBL_N”元素。如果它们的数量没有理论上的上限,这可能是不切实际的。

    只要它的 xml 有效,您就可以加载它并计算元素 DOC 的所有子元素,然后动态编写模式,但这听起来像是在自我挫败。

    这可能会让您不得不使用某些 xpath 手动验证 xml 实例 - 这是一种蛮力方法,而不是在技术上针对 xsd 架构进行验证。

    【讨论】:

    • 输入是一个巨大的文档,所以比简单的 Schmea 更多的代码是不可行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多