4

次のlinqコードがあり、xmlファイルをデータテーブルに解析しようとしていますが、結果のデータテーブルに奇妙な値が表示され、すべてのセル値が次のように表示されます

System.Xml.Ling.XContainer+<GetElements>d_11

これが私のLINQです

            XDocument doc1 = XDocument.Load(@"D:\m.xml");
            var q = from address in doc1.Root.Elements("Address")
                    let name = address.Elements("Name")
                    let street = address.Elements("Street")
                    let city = address.Elements("city")
                    select new
                    {
                        Name = name,
                        Street = street,
                        City = city
                    };

            var xdt = new DataTable();

            xdt.Columns.Add("Name", typeof(string));
            xdt.Columns.Add("Street", typeof(string));
            xdt.Columns.Add("City", typeof(string));

            foreach (var address in q)
            {
                xdt.Rows.Add(address.Name, address.Street, address.City);
            }

            dataGrid1.ItemsSource = xdt.DefaultView;

ここに私のxmlがあります:

<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
  <Address Type="Shipping">
    <Name>Ellen Adams</Name>
    <Street>123 Maple Street</Street>
    <City>Mill Valley</City>
    <State>CA</State>
    <Zip>10999</Zip>
    <Country>USA</Country>
  </Address>
  <Address Type="Billing">
    <Name>Tai Yee</Name>
    <Street>8 Oak Avenue</Street>
    <City>Old Town</City>
    <State>PA</State>
    <Zip>95819</Zip>
    <Country>USA</Country>
  </Address>
</PurchaseOrder>

そして、ここに私が得た結果があります! ここに画像の説明を入力

4

7 に答える 7

5

XElements の内部テキストを再取得するのを忘れました。したがって、属性などを含む要素全体を選択しています。コードの次の部分を使用します。

var q = from address in doc1.Root.Elements("Address")
let name = address.Element("Name")
let street = address.Element("Street")
let city = address.Element("city")
select new
{
    Name = name.Value,
    Street = street.Value,
    City = city.Value
};
于 2013-03-04T17:32:13.450 に答える
4

address.Elements("Name")タイプ「名前」のすべての要素のコレクションです。あなたの場合、それはサイズ1のコレクションですが、それでもコレクションです。そのコレクションから最初の項目を取得し (それが唯一の項目になることがわかっているため)、その要素のテキスト値を取得します。Elementの代わりに使用するElementsと、アイテムのコレクションではなく、一致する最初のアイテムが取得されます。

単一の要素を取得したので、要素自体ではなく、その要素の値も取得する必要があります (実際には他に興味深いものは何もありませんが、一般的なケースでは他の多くの情報も含まれています)。この特定のケース。

var q = from address in doc1.Root.Elements("Address")
        select new
        {
            Name = address.Element("Name").Value,
            Street = address.Element("Street").Value,
            City = address.Element("City").Value
        };
于 2013-03-04T17:31:33.417 に答える
1

などに変更address.Elements("Name")address.Elements("Name").FirstOrDefault()ます。

于 2013-03-04T17:36:35.953 に答える
1

これはどのように機能しますか?

        var q = from address in doc1.Root.Elements("Address")
                let name = (string)(address.Element("Name"))
                let street = (string)(address.Element("Street"))
                let city = (string)(address.Element("city")) 
                //...

http://msdn.microsoft.com/en-us/library/bb155263.aspx

于 2013-03-04T17:30:24.937 に答える
1

Elements メソッドは IEnumerable を返します。したがって、let 変数は、単一の要素ではなく、一連の要素を指します。返された単一の要素 (XElement) を取得し、その Value プロパティを取得して、そのコンテンツの連結テキストを取得する必要があります。(ドキュメントによる)

それ以外の


                    select new
                    {
                        Name = name,
                        Street = street,
                        City = city
                    }

あなたは書くべきです:


                    select new
                    {
                        Name = name.Single().Value,
                        Street = street.Single().Value,
                        City = city.Single().Value
                    }

そこに、または let 式で直接。ヘルパー メソッドも役立つ場合があります。


    public static string StringValueOfElementNamed(XElement node, string elementName) {
        return node.Elements(elementName).Single().Value;
    }

メンバー アクセス構文を使用する場合は、このヘルパー メソッドを拡張メソッドに変換します。

編集:同時回答を読んだ後、使用するより良い方法は次のとおりです。


    public static string StringValueOfElementNamed(XElement node, string elementName) {
        return node.Element(elementName).Value;
    }

Element は、最初に見つかった要素を返します。要素が見つからない場合に返される null ポインターに注意してください。

于 2013-03-04T17:38:51.130 に答える
1

Elementsヘルパー クラスにラップされた n 個の要素を返す呼び出しを行っています。

おそらく、最初の要素をオブジェクトElementとして返す whichを呼び出すつもりです。XElement

于 2013-03-04T17:32:46.393 に答える
1

これを試して:

var q = from address in doc1.Root.Elements("Address")
        let name = address.Element("Name").Value
        let street = address.Element("Street").Value
        let city = address.Element("City").Value
于 2013-03-04T17:33:02.713 に答える