读取具有 "anyType" 的 XSD 和属性 xsi:type="string" 的 XML 元素

Read XML element with XSD of "anyType" and attribute xsi:type="string"

我正在尝试阅读一个 XML 文档(这是一个 SAML 令牌,但它不是特定的 SAML 相关问题)。 XSD(参见 here)指定了 < saml:AttributeValue> 元素XSD 像这样:

 <element name="AttributeValue" type="anyType" nillable="true"/>

它说它可以是 anyType 没问题。

但实际的 XML 已尝试指定命名空间和类型,而我的 XMLReader 在格式不正确之前难以阅读它。

<saml:AttributeStatement>
   <saml:Attribute Name="Town">
      <saml:AttributeValue
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="string">
                Glasgow
      </saml:AttributeValue>
  </saml:Attribute>
</saml:AttributeStatement>

当我尝试使用此代码阅读 XML 时...

//This code just simulates the XmlReader navigating over the document, rather than a specific function.
var sr = new StringReader(xmlString);
var reader = XmlReader.Create(sr);
var output = reader.ReadSubTree();

我收到这个错误...

{"ID4254: The AttributeValueXsiType of a SAML Attribute must be a string of the form 'prefix#suffix', where prefix and suffix are non-empty strings.\r\nParameter name: value"}

这是System.IdentityModel.Tokens.SamlAttributeclass抛出的,看代码here

我认为是 xsi:type="string" 的格式导致了问题。如果我在 xsi:type="string"[ 的类型属性中包含 xs:(见下文),似乎工作正常。

      <saml:AttributeValue
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="xs:string">
                Glasgow
      </saml:AttributeValue>
  1. 哪个有效XML? xsi:type="string"xsi:type="xs:string"

  2. 我是否缺少命名空间引用?

(这个XML消息是第三方生成的,所以我无法更改它,想知道它是否有效)。

更新

根元素确实包含以下命名空间引用:

<Request xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
xmlns="http://thirdparty.co.uk/schema">
  1. 据我推测,默认命名空间是“http://thirdparty.co.uk/schema”??

试试这个

<?xml version="1.0" encoding="utf-8" ?>
<Root xmlns:saml="anything">
<saml:AttributeStatement>
  <saml:Attribute Name="Town">
    <saml:AttributeValue
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:type="string">
      Glasgow
    </saml:AttributeValue>
  </saml:Attribute>
</saml:AttributeStatement>
</Root>​

问题出在您使用的类型值的范围上。根据您最近的更新,默认架构是 http://thirdparty.co.uk/schema

考虑场景:

 <saml:AttributeValue
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="string">
                Glasgow
 </saml:AttributeValue>

意味着解析器将尝试在默认架构中找到 string 类型,当然 string 未定义。

现在,当您将其更改为 xs:string 时,意味着您明确告诉您在命名空间别名 xs 中查找 string。这就是为什么下面是正确的:

 <saml:AttributeValue
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="xs:string">
                Glasgow
 </saml:AttributeValue>

尽管您收到的错误消息是一个验证错误,它可能适用于严格使用带值的命名空间别名。