【问题标题】:Check XML via XSD schemas which are specified in xsi:schemaLocation attribute通过 xsi:schemaLocation 属性中指定的 XSD 模式检查 XML
【发布时间】:2012-05-04 08:33:06
【问题描述】:

对不起我的英语。

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 中找到了两个示例: first, second.

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

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

问候

【问题讨论】:

  • 我能否澄清一下:这里的重点是“我已经在本地拥有这些文件,不希望它去mea-orbis.com 获取它们”?
  • 另外:是否可以选择通过 XmlReader 进行验证?因为这允许您使用 XmlResolver,更具体地说 - XmlPreloadedResolver,它听起来就像你想要的......

标签: c# .net xml linq xsd


【解决方案1】:

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

Validating an XML against referenced XSD in C#

我刚刚检查过它至少对本地存储的 xsd 有效。

【讨论】:

    【解决方案2】:

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

    我的做法涉及以下步骤:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多