1

英語でごめんなさい。

C#4.0、LINQtoXML。

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>

XSDスキーマ検証のためにXDocumentをチェックする必要があります。私はMSDNで2つの例を見つけました: 最初2番目

ただし、サンプルでは、​​XSDスキーマはファイルとは別のものです。これらのスキーマはXMLファイルのxsi:schemaLocation属性ですでに指定されているため、余分な操作は行いたくありません。

必要なすべてのスキーマがxsi:schemaLocation属性ですでに指定されているオブジェクトXDocumentのチェックを実行する正しい方法は何ですか?

よろしく

4

2 に答える 2

1

これは少し遅いかもしれませんが、私はこの質問を見つけました、そしてそれから私はスタックオーバーフローの他の場所でこの答えを見つけました:

C#で参照されたXSDに対してXMLを検証します

少なくともローカルに保存されたxsdで機能することを確認しました。

于 2012-12-07T01:07:30.277 に答える
0

スキーマの場所のxsi属性の処理は、フレームワークに組み込まれていません。あなたはそれを自分でしなければならないでしょう。

私がそれを行った方法には、次の手順が含まれます。

  • ドキュメントのルート要素に関連付けられているschemaLocationまたはnoNamespaceSchemaLocation属性を読み取ります。ここで、ニーズに最適なソリューションを考え出す必要があります。パフォーマンスを気にしない場合は、DOMベースのAPIを使用するだけで済みます。ソースXMLを2回調べる場合があります。1回はメモリに解析し、もう1回は検証します。または、高速で転送専用のリーダーを使用して、ルートノードのすべての属性のみを読み取り、xsi:を探してから、ルート要素を超えて読み取りを中止します。
  • 見つかったら、属性値を解析する必要があります。通常、空白(\ t、\ r、\ n、0x20)でstring.Split()を呼び出し、すべてをトリミングし、空を破棄してペアを作成します(名前空間が使用されている場合)。最終的に、これにより、XSDが配置されているURIのリストが得られます
  • URIごとに、それを絶対URIに解決し、最終的にXMLファイルのベース絶対URIを使用して相対URIを変換します
  • すべてのXSDを追加して、XmlSchemaSetを構築します。それをコンパイルし、ソースXMLからリーダーを取得して検証に使用します。
于 2012-05-04T13:39:45.850 に答える