1

对不起我的英语不好。

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 属性中指定?

问候

4

2 回答 2

1

这可能有点晚了,但我发现了这个问题,然后我在 Stack Overflow 的其他地方找到了这个答案:

Validating an XML against referenced XSD in C#

我刚刚检查过它是否至少适用于本地存储的 xsd。

于 2012-12-07T01:07:30.277 回答
0

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

我这样做的方式涉及以下步骤:

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