在 .NET 中进行验证时,我们有一个导致 XMLSchemaException 的 XML。使用 MSXML 验证相同的 XML 很好,不会导致错误。
XML 文档使用底层 FDT 技术所需的 XDR 内联模式,因此我不能使用 DTD 或 W3C 模式,我必须坚持使用旧的和过时的 XDR 验证。
我已将其最小化为以下 SSCCE,因此您可以自己尝试。也可在dotNetFiddle上获得:
using System.IO;
using System.Xml;
namespace XDRInlineReferenceInline
{
public class Program
{
private static string xml =
@"<Root xmlns:dt=""urn:schemas-microsoft-com:datatypes"" xmlns:s=""urn:schemas-microsoft-com:xml-data"">
<s:Schema name=""InlineA"">
<s:AttributeType name=""att"" dt:type=""ui1"" />
</s:Schema>
<s:Schema name=""InlineB"" xmlns:a=""x-schema:#InlineA"">
<s:ElementType name=""Ele"" content=""empty"" model=""closed"">
<s:attribute type=""a:att"" required=""yes"" />
</s:ElementType>
</s:Schema>
<Ele xmlns=""x-schema:#InlineB"" xmlns:a=""x-schema:#InlineA"" a:att=""1"" />
</Root>";
public static void Main()
{
var textReader = new XmlTextReader(new StringReader(xml));
var validatingReader = new XmlValidatingReader(textReader) {ValidationType = ValidationType.XDR};
var xmlDoc = new XmlDocument();
xmlDoc.Load(validatingReader);
}
}
}
这是 .NET 解析器的错误,还是有什么我可以改变以使其工作的?
我曾尝试更改 XML 文档中模式的顺序,但这无济于事。
请不要建议将两种不同的模式合二为一。我已经尝试过了,它有效,但不幸的是它不是一个选择。由于模式名称同时用作命名空间,所有现有产品的 XPath 都需要更改。