通过xsi:schemaLocation属性中指定的XSD架构检查XML

时间:2012-05-04 08:33:06

标签: c# .net xml linq xsd

抱歉我的英文。

C#4.0,LINQ to XML。

我从XML文件中获取XDocument,例如:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../support/localization.xslt"?>
<doc:resources xmlns:doc="http://mea-orbis.com/2012/XMLSchema/localization"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://mea-orbis.com/2012/XMLSchema/localization ../../support/localization.xsd">
  <!--Заголовки столбцов таблицы-->
  <doc:record id="commandName">Команда</doc:record>
  <doc:record id="commandNameDescript">Краткое описание</doc:record>
  <doc:record id="commandNameNotes">Примечание</doc:record>
  <!--******************************************-->

  <!--Наименования групп команд-->
  <doc:record id="group1">Команды смены кодировок</doc:record>

  <!--******************************************-->

  <!--Наименования команд, их краткое описание и примечания-->
  <doc:record id="dwgconvertName">DWGCONVERT</doc:record>
  <doc:record id="dwgconvertKeyWords">кодировка</doc:record>
  <doc:record id="dwgconvertDescr">конвертация текущего чертежа (версии AutoCAD до 2011 включительно)</doc:record>

  <doc:record id="dwgconvertcpName">DWGCONVERTCP</doc:record>
  <doc:record id="dwgconvertcpKeyWords">кодировка</doc:record>
  <doc:record id="dwgconvertcpDescr">конвертация текущего чертежа (версии AutoCAD с 2008)</doc:record>

  <doc:record id="dwgconvertfilesName">DWGCONVERTFILES</doc:record>
  <doc:record id="dwgconvertfilesKeyW">кодировка</doc:record>
  <doc:record id="dwgconvertfilesDescr">конвертация выбранных пользователем чертежей</doc:record>

  <doc:record id="dwgconvertstrName">DWGCONVERTSTR</doc:record>
  <doc:record id="dwgconvertstrKeyW">кодировка</doc:record>
  <doc:record id="dwgconvertstrDescr">
    конвертация отдельного текстового примитива (примитивов)
    из текущего чертежа
  </doc:record>
  <doc:record id="ns">DWGCONVERT</doc:record>

  <doc:record id="arxload">Загрузка всех ARX файлов</doc:record>
  <doc:record id="netload">Загрузка всех DLL файлов</doc:record>
</doc:resources>

我需要检查XDocument以进行XSD架构验证。我在MSDN中找到了两个例子: firstsecond

但是在示例中,XSD架构与文件是分开的。我不想做多余的操作,因为这些模式已经在我的XML文件的xsi:schemaLocation属性中指定。

执行对象XDocument检查的正确方法是什么,其中已在xsi:schemaLocation属性中指定了所有必需的模式?

此致

2 个答案:

答案 0 :(得分:1)

这可能有点晚了,但我发现了这个问题,然后我在Stack Overflow的其他地方找到了这个答案:
Validating an XML against referenced XSD in C#

我刚刚检查过它至少可以用于本地存储的xsd。

答案 1 :(得分:0)

框架中没有构建模式位置的xsi属性的处理;你必须自己做。

我的方式涉及以下步骤:

  • 读取与文档根元素关联的schemaLocation或noNamespaceSchemaLocation属性。在这里,您必须提出最适合您需求的解决方案;如果你不关心性能,那么你可以简单地使用基于DOM的API - 它可能导致两次扫描源XML:一次将其解析到内存中,然后再次验证它。或者,您使用快速,仅向前读取器只读取根节点的所有属性,查找xsi:1,然后放弃读取根元素后的读数。
  • 找到后,您将需要解析属性值;通常你在空格上调用string.Split()(\ t,\ r,\ n,0x20),修剪所有内容,丢弃空格并进行配对(使用命名空间时)。最终,这将为您提供XSD所在的URI列表
  • 对于每个URI,将其解析为绝对URI,最后使用XML文件的基本绝对URI转换任何相对
  • 通过添加所有XSD来构建XmlSchemaSet;编译它并通过从源XML获取读者来使用它进行验证。