2013-03-02 55 views
2

我知道这可能比我做得更容易。我可以将所有机器从XElement中取出,但我试图弄清楚如何用特定的序列号拔出机器。在下面的XML片段,我想使用的机器,其中序列= 1通过内部元素查询特定数据的最佳方式是什么?

XML:

<Location> 
    <Sequence>1</Sequence> 
    <Machines> 
    <Machine></Machine> 
    <Machine></Machine> 
    </Machines> 
</Location> 
<Location> 
    <Sequence>2</Sequence> 
    <Machines> 
    <Machine></Machine> 
    <Machine></Machine> 
    </Machines> 
</Location> 

代码:

IEnumerable<XElement> locSeqMachines = 
         from seq in LocationRows.Descendants("Location") 
         select seq; 

var eMachines = locSeqMachines.Descendants("Machine"); 
foreach (var machine in eMachines) 
{ 
} 

回答

2

像这样的东西应该做的工作:

int soughtId = 1; // Assuming this is coming from somewhere 
string soughtIdStr = soughtId.ToString(); 
var machines = LocationRows.Descendants("Location") 
          .Where(l => (string)l.Element("Sequence") == 
             soughtIdStr) 
          .Descendants("Machine"); 
+0

这就像一个魅力。谢谢大家的回复。 – Sparhawk 2013-03-02 19:06:25

1

您可以使用XPath通过选择节点一个特定的顺序:

XmlNodeList nodeList = root.SelectNodes("descendant::Location[Sequence='1']"); 
1

此代码将组中的所有机器数据进行过滤,对位置的序列值的位置标签:

var locSeqMachines = from seq in LocationRows.Descendants("Location") 
        where seq.Element("Sequence").Value == "1" 
        select new { 
         Sequence = seq.Element("Sequence").Value, 
         Machines = from m in seq.Descendants("Machines").Elements() 
            select m.Value 
        }; 

下面是一些代码演示了如何访问数据(和测试片段):

foreach (var location in locSeqMachines) { 
    Console.WriteLine("sequence: {0}", location.Sequence); 
    foreach (var machine in location.Machines) { 
     Console.WriteLine(" machine: {0}", machine); 
    } 
} 
0

在解析给定的XML,您可以使用this方法不提高多根元素的错误的答案到达。

var xmlText = @"<root> 
         <Location> 
         <Sequence>1</Sequence> 
         <Machines> 
          <Machine></Machine> 
          <Machine></Machine> 
         </Machines> 
         </Location> 
         <Location> 
         <Sequence>2</Sequence> 
         <Machines> 
          <Machine></Machine> 
          <Machine></Machine> 
         </Machines> 
         </Location> 
         </root>"; 

    var elements  = XElement.Parse(xmlText); 
    var machineWith1 = from subElem in elements.Elements("Location") 
          where subElem.Element("Sequence").Value == "1" 
          select subElem.Element("Machines").Elements("Machine"); 

,那么你可以检查machineWith1的这个值,

相关问题