每个分支节点获取3个分支
Get 3 branch of each branching node
我想获取分支节点的第三个节点。例子
<rows>
<row>
<cell>a</cell>
<cell>b</cell>
<cell>c</cell>
<cell>d</cell>
<cell>e</cell>
<cell>f</cell></row>
<row>
<cell>aa</cell>
<cell>bb</cell>
<cell>cc</cell>
<cell>dd</cell>
<cell>ee</cell>
<cell>ff</cell>
</row>
......
</rows>
我基本上是想把项目c和cc等等弄出来。基本上是行中的第三个单元格元素。这就是我所拥有的。但是我想要的是项目的值而不是 xml.
var Study = XDocument.Load(XmlReader.Create(studyStream));
var rows = Study.Descendants("row");
foreach (var item in rows)
{
var cells = item.Descendants("cell");
string id = null;
foreach (var items in cells)
{
id = items.Parent.FirstNode.NextNode.NextNode.ToString();
}
Console.WriteLine(id);
}
Console.Read();
有没有办法正确地做到这一点?谢谢大家的帮助。
凯文
嗯,你可以这样做:
var xdoc = XDocument.Load(@"your_file.xml");
foreach (var children in xdoc.XPathSelectElements("rows/row"))
{
var thirdChild = children.Elements().Skip(2).Take(1).FirstOrDefault();
if (thirdChild != null)
Console.WriteLine(thirdChild.Value);
}
这里我们首先选择 /row
元素,然后为每个这样的行选择第三个子元素的值。
这个有值集合也可以不用foreach
循环得到,只能通过linq查询如:
var values = xdoc.XPathSelectElements("rows/row")
.Select(row => row.Elements().Skip(2).Take(1).First().Value);
你也可以这样做
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input =
"<rows>" +
"<row>" +
"<cell>a</cell>" +
"<cell>b</cell>" +
"<cell>c</cell>" +
"<cell>d</cell>" +
"<cell>e</cell>" +
"<cell>f</cell></row>" +
"<row>" +
"<cell>aa</cell>" +
"<cell>bb</cell>" +
"<cell>cc</cell>" +
"<cell>dd</cell>" +
"<cell>ee</cell>" +
"<cell>ff</cell>" +
"</row>" +
"</rows>";
XElement rows = XElement.Parse(input);
var results = rows.Descendants("row").Select(x => new
{
cells = x.Elements("cell").Select(y => y.Value).ToList()
}).ToList();
List<string> thirdCells = results.Select(x => x.cells[2]).ToList();
}
}
}
我想获取分支节点的第三个节点。例子
<rows>
<row>
<cell>a</cell>
<cell>b</cell>
<cell>c</cell>
<cell>d</cell>
<cell>e</cell>
<cell>f</cell></row>
<row>
<cell>aa</cell>
<cell>bb</cell>
<cell>cc</cell>
<cell>dd</cell>
<cell>ee</cell>
<cell>ff</cell>
</row>
......
</rows>
我基本上是想把项目c和cc等等弄出来。基本上是行中的第三个单元格元素。这就是我所拥有的。但是我想要的是项目的值而不是 xml.
var Study = XDocument.Load(XmlReader.Create(studyStream));
var rows = Study.Descendants("row");
foreach (var item in rows)
{
var cells = item.Descendants("cell");
string id = null;
foreach (var items in cells)
{
id = items.Parent.FirstNode.NextNode.NextNode.ToString();
}
Console.WriteLine(id);
}
Console.Read();
有没有办法正确地做到这一点?谢谢大家的帮助。
凯文
嗯,你可以这样做:
var xdoc = XDocument.Load(@"your_file.xml");
foreach (var children in xdoc.XPathSelectElements("rows/row"))
{
var thirdChild = children.Elements().Skip(2).Take(1).FirstOrDefault();
if (thirdChild != null)
Console.WriteLine(thirdChild.Value);
}
这里我们首先选择 /row
元素,然后为每个这样的行选择第三个子元素的值。
这个有值集合也可以不用foreach
循环得到,只能通过linq查询如:
var values = xdoc.XPathSelectElements("rows/row")
.Select(row => row.Elements().Skip(2).Take(1).First().Value);
你也可以这样做
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input =
"<rows>" +
"<row>" +
"<cell>a</cell>" +
"<cell>b</cell>" +
"<cell>c</cell>" +
"<cell>d</cell>" +
"<cell>e</cell>" +
"<cell>f</cell></row>" +
"<row>" +
"<cell>aa</cell>" +
"<cell>bb</cell>" +
"<cell>cc</cell>" +
"<cell>dd</cell>" +
"<cell>ee</cell>" +
"<cell>ff</cell>" +
"</row>" +
"</rows>";
XElement rows = XElement.Parse(input);
var results = rows.Descendants("row").Select(x => new
{
cells = x.Elements("cell").Select(y => y.Value).ToList()
}).ToList();
List<string> thirdCells = results.Select(x => x.cells[2]).ToList();
}
}
}