我正在比较基于相同XMLSchema的两个XML。 XML中的每个元素都有一个id(id不说明顺序 - 最旧的xmlElement具有最低的id,依此类推)。 我的目标是在两个XMLS之间进行一致。
举一个非常简单的例子。 让两个xmls。第一个看起来像这样:
<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>
我的结果应该是id的映射。 它将以1:1,然后2:2,100:100开始。这时我遇到了两个名字不同的xml元素。我知道它们可能不匹配,所以两种可能的解决方案是采用3:*(其中* =符号表示不匹配)然后*:4或采用:4然后3: 。 但只有一种方法是正确的解决方案,因为架构说UnknownOrderEle2(id = 4)应该在UnknownOrderEle1之前(id = 3。
所以我在XmlSchema类中查找了任何内容,XmlSchemaInfo
,XmlSchemaElement
,......告诉我有关元素顺序的任何信息。我找到的唯一两种可能性对我来说都不是真正的解决方案,因为它们太耗时或不洁净。
一种方法是比较LineNumber
内的LinePosition
和XmlSchemaObject
(可能是不干净的)。
另一个是从两个xmls中构造一个xml并验证它。如果它抛出验证异常,我知道我选择的顺序是错误的(绝对耗时)。
如果有人知道更好的解决方案,我会很高兴得到任何帮助。
答案 0 :(得分: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
是有效子元素Ele
,Name
,Description
,UnknownOrderEle1
,UnknownOrderEle2
的列表,正确无误顺序。
只要您的架构很简单,这种方法就可以工作,但如果类型的定义不是简单的序列,而是更复杂 - 使用choice
,组等等,它就会变得复杂得多,另一种创建XML文件并尝试验证它的方法可能会更好。