3

既存のシステムの一部のコードをリファクタリングしています。目標は、XmlDocument のすべてのインスタンスを削除して、メモリ フットプリントを削減することです。ただし、特定のルールが適用される場合は、XPath を使用して xml を操作します。ドキュメント全体をメモリにロードするクラスを使用せずに XPath を使用する方法はありますか? 他のすべてのインスタンスを XmlTextReader に置き換えましたが、XPath がなく、読み取りが非常に単純であるため、これらのインスタンスのみが機能しました。

一部の XPath は、他のノードの値を使用して決定を下します。たとえば、メッセージ ノードの値は、金額ノードの値に基づいている可能性があるため、一度に複数のノードにアクセスする必要があります。

4

4 に答える 4

3

XPATH 式が複数のノードへのアクセスに基づいている場合は、XML を DOM に読み込む必要があります。ただし、2つのこと。まず、すべてを DOM に読み込む必要はなく、クエリを実行している部分だけを読み込みます。次に、使用する DOM によって違いが生じます。XPathDocument は読み取り専用であり、XPATH クエリの速度に合わせて調整されています。これは、より汎用的ですが高価な XmlDocument とは異なります。

于 2009-10-01T15:08:27.863 に答える
1

System.Xml.Linq.XDocumentの使用も禁止されていると思いますか? それ以外の場合は、XmlDocument よりも高速であるため (私が覚えているように)、これを選択することをお勧めします。

于 2009-10-01T15:09:07.420 に答える
0

これを行う方法は、ストリームを取得できるXPathDocumentを使用することです。したがって、StringReaderを使用できます。

これにより、XML DOM全体をXmlDocumentを使用してメモリにロードするオーバーヘッドなしに、前方読み取り方式で値が返されます。

XPathクエリを満たす最初のノードの値を返す例を次に示します。

public string extract(string input_xml)
    {
        XPathDocument document = new XPathDocument(new StringReader(input_xml));
        XPathNavigator navigator = document.CreateNavigator();
        XPathNodeIterator node_iterator = navigator.Select(SEARCH_EXPRESSION);
        node_iterator.MoveNext();
        return node_iterator.Current.Value;
    }
于 2011-11-16T16:25:57.337 に答える
0

XPath をサポートするということは、次のようなクエリをサポートすることを意味します。

//address[/states/state[@code=current()/@code]='California']

また

//item[@id != preceding-sibling/item/@id]

XPath プロセッサがドキュメント内のあらゆる場所を検索できる必要があります。前方専用の XPath プロセッサを見つけることはできません。

于 2009-10-01T19:14:38.547 に答える