1

XPathNavigatorを多用して特定のxmlドキュメントを解析するコードライブラリがあります。xmlドキュメントは相互参照されます。つまり、要素は、解析中にまだ検出されていない別の要素を参照できます。

<ElementA ...>
    <DependentElementX id="1234">
</ElementA>

<ElementX id="1234" .../>

ドキュメントは実際にはこのようには見えませんが、ポイントは、1)ドキュメント構造全体を強制するxmlスキーマがあり、2)ドキュメント内の要素がいくつかのIDを使用して相互に参照できること、および3)かなりあることです。ドキュメント内の異なる要素間のそのような相互参照はほとんどありません。

ドキュメントは2つのフェーズで解析されます。最初のパスで、ドキュメントをウォークスルーします

XPathDocument doc = ...;
XPathNavigator nav = doc.CreateNavigator();
nav.MoveToRoot();
nav.MoveToFirstChild()...

また、XPathNavigator.Clone()メソッドを使用して、ドキュメント内の現在の位置(要素)を「ブックマーク」することもあります。これにより、XPathNavigatorの軽量インスタンスが得られ、これをどこかに保存して、後でドキュメント内の特定の場所(要素)に戻るために使用できます。

最初のパスで十分な情報が収集されたら(たとえば、id = '1234'のElementXが実際に存在することを確認しました)、保存されたブックマークに戻って(保存されたXPathNavigatorを使用して)解析を完了します。

さて、今私はSilverlight 3.0でこのライブラリを使用しようとしていますが、恐ろしいことにXPathNavigatorはSystem.Xmlアセンブリにありません。

質問:

1)明らかな何かが欠けていますか(つまり、XPathNavigatorは、ツールキットやフリーウェアライブラリなど、何らかの形や形式で存在します)?

2)コードに変更を加える必要がある場合、最善の方法は何ですか?理想的には、XLinqのようなものを使用できるようにするためだけに、コードの80%を書き直さないように、最小限の変更を加えたいと思います。

再開するには、XPathNavigatorをあきらめなければならない場合に必要なのは、ドキュメント内の場所をブックマークして、それらに戻って、中断したところから繰り返し続けることができるようにする方法だけです。

ヘルプ/アイデアを事前に感謝します。

4

3 に答える 3

1

XPath(xdoc.XPathSelectElements)はSilverlight4で使用できます。これがオンラインテストツールです。

于 2010-04-22T19:27:47.480 に答える
1

明らかな何かを見逃しているわけではありません。SilverlightバージョンのライブラリにはXPathNavigatorまたはXPathDocumentの実装はありません。

「最善の方法」は非常に主観的であり、実際に依存しているコードの行数に依存しXPathNavigatorます。ただし、いくつかの選択肢があります。

  • 先に進み、System.Xml.Linq namepsaceのXDocument、XElementなどを使用してコードを書き直します。これはあなたが思うほど悪い選択ではないかもしれません。
  • Xml-to-Linqオブジェクトを、XPathNavigator実際に使用しているのプロパティとメソッドの独自の実装にラップします。XPathNavigatorXml-to-Linqオブジェクトに対してのほとんどの機能を再作成するのはそれほど難しいことではありません。次に、既存のコードを自分のコードに対して実行できますXPathNavigator
于 2010-03-14T21:37:51.703 に答える
0

たくさんの方法があります: C#でXMLを処理する方法

linq構文を差し引いたLinqtoXMLを引き続き使用し、LinqExtensionメソッドを使用できます。

于 2010-03-14T21:37:24.123 に答える