0

我正在比较基于相同 XMLSchema 的两个 XML。XML 中的每个元素都有一个 id(id 没有说明顺序 - 最旧的 xmlElement 具有最低的 id 等等)。我的目标是在两个 XMLS 之间取得某种一致。

举一个非常简单的例子。让有两个xml。第一个看起来像这样:

<EleType>
    <Ele id="1"/>
    <Name id="2"/>
    <Description id="100"/>
    <UnknownOrderEle1 id="3"/>
</EleType>

第二个是这样的:

<EleType>
    <Ele id="1"/>
    <Name id="2"/>
    <Description id="100"/>
    <UnknownOrderEle2 id="4"/>
</EleType>

我的结果应该是 ids 的映射。它将以 1:1、2:2、100:100 很好地开始。此时我遇到了两个名称不同的 xml 元素。我知道它们可能不匹配,因此两种可能的解决方案是采用 3:* (其中 * = 符号表示不匹配)然后 *:4 或采用:4 然后 3:。但是只有一种方法是正确的解决方案,因为架构说 UnknownOrderEle2 (id=4) 应该在 UnknownOrderEle1 (id=3.

所以我在 XmlSchema 类中寻找任何东西,XmlSchemaInfo, XmlSchemaElement,... 告诉我有关元素顺序的任何信息。我发现的仅有的两种可能性对我来说没有真正的解决方案,因为它们要么太耗时,要么不干净。一种是比较(可能是不洁的)的LineNumberLinePosition内的。XmlSchemaObject另一种是从两个 xml 中构造一个 xml 并对其进行验证。如果它引发验证异常,我知道我选择的顺序是错误的(肯定很耗时)。

如果有人知道更好的解决方案,我将很高兴获得任何帮助。

4

1 回答 1

0

与您的示例对应的架构应包含以下内容:

<xs:element name="EleType">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Ele">
        . . .
      </xs:element>
      <xs:element name="Name">
        . . .
      </xs:element>
      <xs:element name="Description">
        . . .
      </xs:element>
      <xs:element name="UnknownOrderEle1">
        . . .
      </xs:element>
      <xs:element name="UnknownOrderEle2">
        . . .
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

加载后,您可以使用如下代码获取相应的XmlSchemaElement对象,然后获取其子元素的顺序:

XmlSchemaElement element = schema.Elements[new XmlQualifiedName("EleType")];
XmlSchemaType complexType = (XmlSchemaComplexType)element.ElementSchemaType;
XmlSchemaSequence sequence = (XmlSchemaSequence)complexType.Particle;
XmlSchemaObjectCollection childElements = sequence.Items;

childElements是按正确顺序排列的有效子元素EleNameDescriptionUnknownOrderEle1、的列表。UnknownOrderEle2

只要您的模式很简单,它就可以工作,但是如果类型的定义不是简单的序列而是更复杂的 - with choice, groups 等等,它就会变得更加复杂,以至于创建 XML 文件的另一种方法并尝试验证它可能会变得更好。

于 2013-02-25T19:49:38.317 回答