Xml验证问题与意外的元素列表

时间:2014-07-24 15:50:00

标签: c# xml xsd biztalk xml-validation

我是一个标准的Schema格式,如下所示

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://HR_XML_BizTalk_Project_Schemas.Schema1" targetNamespace="http://HR_XML_BizTalk_Project_Schemas.Schema1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="UserDetails">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Any">
                <xs:complexType />
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>  

但我的合作伙伴以下面的格式发送xml。

<ns0:Root xmlns:ns0="http://HR_XML_BizTalk_Project_Schemas.Schema1">
  <UserDetails>
    <ID>ID_0</ID>
    <Name>Name_0</Name>
    <Account>Account_0</Account>
    <Amount>Amount_0</Amount>
  </UserDetails>
</ns0:Root>  

我收到错误“元素'UserDetails'具有无效的子元素'ID'。预期的可能元素列表:'Any'”

根据我的理解,我必须告诉我的合作伙伴不要在UserDetails Record下发送任何数据。
否则,我必须删除节点,如果在验证之前在UserDetails记录下存在任何内容。

还有其他方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

<xs:element name="Any">

查找名为Any的元素 如果可能是任何元素,你的意思是什么:

<xs:any>

答案 1 :(得分:1)

您是否真的打算为Any的内容要求名为UserDetails的元素?

如果您希望允许UserDetails下的任何元素序列,请将您的XSD更改为以下内容:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003"
           xmlns="http://HR_XML_BizTalk_Project_Schemas.Schema1"
           targetNamespace="http://HR_XML_BizTalk_Project_Schemas.Schema1"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="UserDetails">
          <xs:complexType>
            <xs:sequence>
              <xs:any maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>  

然后您的合作伙伴的XML将有效。

但是,请注意,使用xsd:any时,您无法很好地传达界面要求。最好是陈述服务的实际要求,除非你真的不在乎UserDetails下的内容。

答案 2 :(得分:0)

如果我正确理解了你的XSD,那么它需要XML:

<ns0:Root xmlns:ns0="http://HR_XML_BizTalk_Project_Schemas.Schema1">
  <UserDetails>
    <Any></Any>
  </UserDetails>
</ns0:Root>

我不确定您要检查什么,但您的验证器似乎行为正确。请解释一下你想做什么,并确保sombody能够帮助你。