2012-09-12 33 views
2

我对Linq的XML很感兴趣。这个问题似乎很简单,但我似乎无法弄清楚。希望有人能帮助我。我得到这样的soapresponses:如何解析不是唯一的多个XML元素

<customernumbers>  
    <customernumber>99999</customernumber>  
    <customernumber>27554</customernumber>   
    <customernumber>27555</customernumber>  
</customernumbers> 

而我想解析这个XML文档在列表中。我使用此代码:

var xml = XDocument.Load (@"c:\\mydata.xml"); 
var query =from e in xml.Elements("customernumbers") 
    select e.Value; 
query.Dump(); 

    5IEnumerable<String> (1 item) 
    999992755427555 

Ofcource我想要的是3个客户号码分开。不在1个字符串中。

任何帮助将不胜感激。

//藩

回答

2

您的查询基本上是选择你的根节点<customernumbers>的价值,但XElement.Value属性将返回所有子节点的值完全按照您的示例展示。相反,您需要做的是选择查询中的每个子节点。

要使用您的查询的完全一样的格式,你只需要增加一个Elements()方法:

var query = from e in xml.Element("customernumbers").Elements() 
      select e.Value; 

query现在将包含3 String对象,每个对象的集合与一个值的子节点。

如果你有不同的名称的子元素,你只需要具有特定名称元素的值(S),你也能更改此:

var query = from e in xml.Element("customernumbers").Elements("customernumber") 
      select e.Value; 

现在query将包含String的集合任何名称为“customernumber”的子元素的值。

你可以更加缩短这件事:

var query = from e in xml.Descendants("customernumber") 
      select e.Value; 

这将做同样的事情。当你不知道XML的确切结构或者它非常复杂时,这会容易得多。缺点是它会选择任何名称为“customernumber”的子节点,孙子节点或任何其他节点,而不管XML树中的位置如何,所以如果您有多个不同的节点,并且您不想选择<customernumber>标签,这种方法将无法正常工作。

+0

这澄清了很多。感谢您的精心回应 – Phan

1

试试这个迭代子元素:

var query = from e in xml.Element("customernumbers").Elements("customernumber") 
       select e.Value; 
+0

谢谢Xeondev!像魅力一样工作 – Phan

0

尝试,

List<string> customerNumbers = (from e in xmlelement.Elements("customernumber") 
        select e.Value).ToList<string>();