0

如果 xml 文档没有对 XML Schema 的引用,一切正常

<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://www.companyname.com/blabla" 
             xmlns="http://www.companyname.com/blabla">

但是,如果 xml 引用了本地机器上的模式,如下所示:

<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://www.companyname.com/blabla 
                                 Schemas\myschema.xsd" 
             xmlns="http://www.companyname.com/blabla">

这会导致错误“已声明全局元素‘TopElementName’。

XmlReaderSettings xrs = new XmlReaderSettings();
xrs.ValidationType = ValidationType.Schema;
xrs.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
xrs.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
xrs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

//xsd is located (intalled) in this same location where myapp.exe is. 
string startLoc = System.Reflection.Assembly.GetExecutingAssembly().Location;
string xsd = Path.Combine(Path.GetDirectoryName(startLoc), "myschema.xsd");

using (Stream schemaStr = new FileStream(xsd, FileMode.Open))
{
    XmlSchema s = XmlSchema.Read(schemaStr, null);
    xrs.Schemas.Add(s);
}
xrs.Schemas.Compile();

using (XmlReader r = XmlReader.Create(xmlPath, xrs))
{
    while (r.Read()){}
    r.Close();
}

如何避免这个错误?

4

2 回答 2

0

最简单的解决方案:使用选项调用架构处理器,告诉它在调用时读取您指定的架构文档,并忽略正在验证的输入中的 xsi:schemaLocation 提示。(如果您的模式验证器没有此类选项,请获取新的模式验证器。)

第一个示例中的虚假 xsi:schemaLocation 应该是固定的,与验证选项无关。

于 2013-07-05T18:25:54.050 回答
0

我刚刚删除了以下标志:

XmlSchemaValidationFlags.ProcessSchemaLocation
于 2015-02-23T12:32:32.923 回答