繁体   English   中英

XML Schema:不同的元素名称(序列)

[英]XML Schema: Different Element Names (sequence)

我认为我的问题的解决方案非常简单,但是我无法解决它所以,这里是:

我有一个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(也许它不是标准的,请告诉我,我不知道),但是构建这个文档不是我的关注。 我只需要解析它,验证它并转换它。

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

<?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,它是唯一的解决方案。 真正的解决方案是拥有类似的东西:

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

然后XML模式将变得更加容易,并且可以处理任意数量的<DOC_OBL>标记。

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

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

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

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

这可能会让您使用一些xpath手动验证xml实例 - 一种强力方法,而不是技术上验证xsd架构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM