1

前駆

実際に知る必要はありませんが、問題の解決に役立つかもしれないビットは、ELMAH (エラー ログ システム) データベースからレコードのコレクションを取得し、抽出する一連の C# ステートメントを LINQPad で作成していることです。 XML (AllXml) フィールドを各レコードから抽出し、各抽出物を XmlDocument に読み込みます。わかりました、これはかなり簡単に思えますが、今度は各ドキュメントをトラバースして、そこから特定の値を取得する必要があります。

XML 構造の例

注: 潜在的に機密性の高い情報はここから削除しました...

<error type="System.Exception" time="2013-06-11T17:27:28.0122874Z">
    <item name="PATH_INFO">
      <value string="/foo/bar/thisIsTheValueIWant.aspx" />
    </item>
    <item name="PATH_TRANSLATED">
      <value string="C:\site\foo\bar\thisIsPotentiallyAnotherValueIMightWant.aspx" />
    </item>
    <item name="QUERY_STRING">
      <value string="meh" />
    </item>
</error>

この XML は文字列として存在すると考えてください。次のようにロードしました。

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);

問題

ノードの値を取得するのはそれほど難しくありませんが、この例では、値はノードの属性として格納されており、それをトラバースする方法がわかりません!

基本的に、valueノードにネストされたitemノードを取得しname、属性"PATH_INFO"の値を取得する必要があり"string"ます。

どうすればこれを達成できますか?

4

2 に答える 2

3

[XmlNodeオブジェクトAttributesを取得したら、そのコレクションを要求して、名前で必要なものを取得できます。

例:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
XmlNode itemNode = doc.SelectSingleNode("/error/item[@name = 'PATH_INFO']");
if (itemNode != null)
{
    XmlNode value = itemNode.SelectSingleNode("value");
    String valueString = value.Attributes["string"].Value;
}
于 2013-06-13T15:38:00.153 に答える
1
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlString);
        var value = doc.SelectSingleNode("error/item[@name='PATH_INFO']/value/@string").Value;
于 2013-06-13T15:47:33.327 に答える