独特的粒子归因 - XSD问题

时间:2015-08-01 16:45:53

标签: xml xsd

动态地我从MQ接收这些XML中的任何一个。 所有元素应该是相同的序列,并且都是必填字段。

x

var connectionString = ConfigurationManager.AppSettings["connectionString"];

var client = new MongoClient(connectionString);
var database = client.GetDatabase("ES");  

var collection = database.GetCollection<BsonDocument>("MyCollection");
var persons = await collection.Find(new BsonDocument()).ToListAsync();

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<ABC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <IDEN>
   <A>A</A>
   <B>B</B>
   <C>C</C>
  </IDEN>
</ABC>

也试过

错误:

  

Cos-nonambig:A和A(或来自其替代组的元素)   违反&#34;独特的粒子归因&#34;。在验证期间   模式,将为这两个粒子创建歧义

我知道很多人之前遇到过同样的问题,但他们的解决方案都没有帮助我。请建议。

1 个答案:

答案 0 :(得分:2)

问题是由于序列之间的共同元素。第二个序列仅由其中间元素不同,此时只有解析器才能识别模式定义。在完全解析序列之前,无法区分公共元素(<A/><C/>)。模式验证是逐个元素完成的。相反,解析器必须延迟验证,直到遇到第二个元素。我不相信这是解析器的工作方式。相反,我的建议是:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="ABC">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="IDEN">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="A"/>
              <xs:choice>
                <xs:element type="xs:string" name="B"/>
                <xs:element type="xs:string" name="BB"/>
              </xs:choice>
              <xs:element type="xs:string" name="C"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

简而言之,解析器应该以确定的方式知道来自元素本身的元素,而不是后续元素使用什么模式组件用于验证。