1

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

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

4

2 回答 2

2

好吧,当然可以!实际上非常简单:如果每个元素的结构相同,则可以定义一个<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 结构进来,只有糟糕的、不完整的验证是可能的。

马克

于 2009-08-19T12:39:17.627 回答
2

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

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

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

这可能会让您使用一些 xpaths 手动验证 xml 实例——这是一种蛮力方法,而不是在技术上针对 xsd 模式进行验证。

于 2009-08-19T12:46:31.640 回答