2

与えられたコード:

  var doc = new XmlDocument();
  doc.LoadXml(@"<a>
                    <b>test
                        <c>test2</c>
                    </b>
                </a>");
  var node = doc.SelectNodes("/a/b")[0];

node b次に、すべての子ノードからすべてのテキスト要素を取得せずに、-この場合は「test」の「text」値を抽出します(。のinnerTextように)

私は自分がこのコードに頼っていることに気づきました

 var elementText = node.ChildNodes.Cast<XmlNode>().First(a => a.NodeType == XmlNodeType.Text).Value;

残念ながらnode.Value、この場合は他のことをします

linqキャスティングに頼らずにすっきりした/作り付けの方法はありますか?それは私が次のようなことをすることを含みません。

foreach (var childNode in node.ChildNodes)
   if (childNode.NodeType==XmlNodeType.Text)
    ...
4

3 に答える 3

4

私は好きですXDocumentXmlDocument私はそれが扱いやすいと思います。Elementメソッドを使用して「b」要素を検索し、プロパティを使用すると、値を簡単に取得できValueます。

using(var stream = new MemoryStream())
{
    using(var streamWriter = new StreamWriter(stream))
    {
        streamWriter.Write(@"<a>
                                 <b>test
                                     <c>test2</c>
                                 </b>
                             </a>");
        streamWriter.Flush();
        streamWriter.BaseStream.Seek(0, SeekOrigin.Begin);
        var doc = XDocument.Load(stream);
        Console.WriteLine(doc.Element("a").Element("b").FirstNode.ToString());
    }
}

編集:コメントに記載されているように、それは間違った値を取得します。正しく更新しました。

于 2012-09-27T15:51:04.050 に答える
0

Valueの代わりにnode.InnerTextを使用したい。だからあなたはこれを持っているでしょう:

 foreach(XmlNode child in node.ChildNodes)
 {
    if (string.IsNullOrEmpty(s))
    {
        s = child.InnerText;
    }
    else
    {
        s = s.Replace(child.InnerText, "");
    }
 }

   s.Trim();
于 2012-09-27T15:42:49.730 に答える
0

LINQ2XMLでは、これを行うことができます

foreach(XNode elm in doc.Descendants("b").OfType<XText>())
{
//elm has the text
}
于 2012-09-27T15:53:42.030 に答える