37189


お世話になっております。

下記のようなXMLがありまして、C#のLINQ機能で「てすと」と情報を取得したいです。

[code]

    <cell>
        <p>すたっく</p>
        <run> て</run>
        <run> す</run>
        <p>すたっく</p>
        <run> と</run>
    </cell>
    
[/code]

下記のように取得してしまうと

[code]

    doc.Descendants("run").Select(n => n.Value);
    
[/code]

「て」「す」「と」がバラバラに取得されてしまいますので、JOINなどを使いいろいろ考えはしたのですが、  
どうしてもうまくいかないです。

LINQでの取得時にうまくいく方法を教えていただけないでしょうか。

* * *

複数のご回答誠にありがとうございます。

頂いた回答から工夫して挑戦したのですが、どうでもうまく行かず。  
再度質問させていただきたいです。

下記のような状態から

[code]

    <page>
        <cell>
            <p>
                <line>
                    <run></run>
                    <run>た</run>
                    <run>ぬき</run>
                </line>
            </p>
        </cell>
        <cell>
           <p>
               <line>
                    <run>き</run>
                    <run>つ</run>
                    <run>つき</run>
                </line>
            </p>
        </cell>
    </page>
    
[/code]

「たぬき」「きつつき」というワードを取得したいです。

申し訳ありません。もう一度アイディアのほういただけないでしょうか。

よろしくお願いいたします。


CC BY-SA 3.0
2017-08-14T10:03:09.830
37187
2017-08-16T01:09:30.477
2017-08-16T00:49:33.297
24877
24877
question
c# xml linq
LINQでXMLの取得するとき、親が同じものをまとめたい。


`XElement.Parent`でグループ化し、各グループを`string.Concat`などで結合すればよいのでは。

[code]

    doc.Descendants("run")
        .GroupBy(n => n.Parent)
        .Select(g => string.Concat(g.Select(n => n.Value)))
    
[/code]

## 追記

想定通りの結果が得られないとのことですので、上記コードの使用例を掲載しておきます。

[code]

    using System;
    using System.Linq;
    using System.Xml.Linq;
    
    class Program
    {
        static void Main()
        {
            var xml = @"<page><cell>
        <p>
            <line>
                <run></run>
                <run>た</run>
                <run>ぬき</run>
            </line>
        </p>
    </cell>
    <cell>
        <p>
            <line>
                <run>き</run>
                <run>つ</run>
                <run>つき</run>
            </line>
        </p>
    </cell></page>";
    
            var doc = XDocument.Parse(xml);
    
            foreach (var s in doc.Descendants("run").GroupBy(n => n.Parent).Select(g => string.Concat(g.Select(n => n.Value))))
            {
                // たぬき/きつつきが出力される
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }
    }
    
[/code]


CC BY-SA 3.0
2017-08-14T11:35:02.383
37189
2017-08-16T01:09:30.477
2017-08-16T01:09:30.477
5750
5750
37187
answer