4

この特定の XML ドキュメントから値を抽出する方法がわかりません。xml 解析の経験があまりないので、助けを求めています。

XDocument.Loadファイルをロードするために使用する必要があります。

実際に私が使っている

doc = XDocument.Load(uri);
challenge = GetValue(doc, "Challenge");

これは問題なく動作しますが、 Element Rights の内部値を取得するにはどうすればよいですか? (複数の「名前」) 一日の終わりに、私は今する必要があります

Phone = x
Dial = x
HomeAuto = x
BoxAdmin = x

一部のエントリ (Phone、Dial、HomeAuto、BoxAdmin) が欠落している可能性もあります。これは動的です。

ここに私のxmlファイルがあります:

<SessionInfo>
 <SID>68eba0c8cef752a7</SID>
 <Challenge>37a5fe9f</Challenge>
 <BlockTime>0</BlockTime>
 <Rights>
  <Name>Phone</Name>
  <Access>2</Access>
  <Name>Dial</Name>
  <Access>2</Access>
  <Name>HomeAuto</Name>
  <Access>2</Access>
  <Name>BoxAdmin</Name>
  <Access>2</Access>
 </Rights>
</SessionInfo>

編集:(GetValueメソッドを追加)

public string GetValue(XDocument doc, string name)
 {
   XElement info = doc.FirstNode as XElement;
   return info.Element(name).Value;
 }
4

1 に答える 1

3

注意: このソリューションは拡張メソッドを使用するため、using ディレクティブが重要です。そうしないと、必要な関数が表示されません。

using System;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Collections.Generic;

namespace StackOverflow
{
    class Program
    {
        const string xml = "<SessionInfo><SID>68eba0c8cef752a7</SID><Challenge>37a5fe9f</Challenge><BlockTime>0</BlockTime><Rights><Name>Phone</Name><Access>2</Access><Name>Dial</Name><Access>2</Access><Name>HomeAuto</Name><Access>2</Access><Name>BoxAdmin</Name><Access>2</Access></Rights></SessionInfo>";
        static void Main(string[] args)
        {

            XDocument doc = XDocument.Parse(xml); //loads xml from string above rather than file - just to make it easy for me to knock up this sample for you
            string nameOfElementToFind = "Name";
            IEnumerable<XElement> matches = doc.XPathSelectElements(string.Format("//*[local-name()='{0}']",nameOfElementToFind));
            //at this stage you can reference any value from Matches by Index
            Console.WriteLine(matches.Count() > 2 ? "Third name is: " + matches.ElementAt(2).Value : "There less than 3 values");
            //or can loop through
            foreach (XElement match in matches)
            {
                Console.WriteLine(match.Value);
                //or if you also wanted the related access info (this is a bit loose / assumes the Name will always be followed by the related Value
                //Console.WriteLine("{0}: {1}", match.Value, match.XPathSelectElement("./following-sibling::*[1]").Value);
            }
            Console.WriteLine("Done");
            Console.ReadKey();
        }
    }
}

ここで重要なのは行IEnumerable<XElement> matches = doc.XPathSelectElements(string.Format("//*[local-name()=\'{0}\']",nameOfElementToFind));です。が実行された後、string.formatXPath は//*[local-name()='Name']. この XPath ステートメントは、Name という名前のすべてのノードを検索することを示しています。関数が存在するのlocal-name()は、どのスキーマが使用されているかを述べていないためです。この例では、スキーマに関係なく、Name と呼ばれる任意の要素が必要です。

XmlNamespaceManager nm = new XmlNamespaceManager(new NameTable());
nm.AddNamespace("eg", "http://Example/Namespace/Replace/With/Your/Docs/Namespace");
IEnumerable<XElement> matches = document.XPathSelectElements("//eg:Name", nm);

二重スラッシュは、ドキュメント内の任意の場所を検索することを示しています。それを権利に限定するには、 と言うことができます/eg:SessionInfo/eg:Rights/eg:Name。XPath に慣れていない方のために説明すると、XPath は素晴らしい言語であり、XML ドキュメントを最大限に活用したい場合に不可欠です。ご不明な点がございましたら、お気軽にお問い合わせいただくか、オンラインでご確認ください。そこには素晴らしいチュートリアルがあります。

于 2013-09-08T17:55:29.480 に答える