读取具有 "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>
哪个有效XML? xsi:type="string" 或 xsi:type="xs:string"
我是否缺少命名空间引用?
(这个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">
- 据我推测,默认命名空间是“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>
尽管您收到的错误消息是一个验证错误,它可能适用于严格使用带值的命名空间别名。
我正在尝试阅读一个 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>
哪个有效XML? xsi:type="string" 或 xsi:type="xs:string"
我是否缺少命名空间引用?
(这个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">
- 据我推测,默认命名空间是“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>
尽管您收到的错误消息是一个验证错误,它可能适用于严格使用带值的命名空间别名。