2012-05-23 3 views
1
<Root xmlns="http://tempuri.org/DataSourceSchemaConfig.xsd"> 
<Node> 
    <Name>Peter</Name> 
</Node> 
<Node> 
    <Name>John</Name> 
</Node> 
</Root> 

이름 목록을 얻으려면 어떻게해야합니까?LINQ TO XML 솔루션

나는 이것을 시도했지만 작동하지 않는다. 내 실수는 어디에 있는가? 내가 = "http://tempuri.org/DataSourceSchemaConfig.xsd을"내 ROOT 태그에서의 xmlns를 제거하면

  var lists = from node in nodes.Descendants() 
         where node.Name.LocalName.Equals("Node") 
         select node.Elements("Name").First().Value; 

L.B의 솔루션은 작동합니다.

+0

사용중인 .NET 버전은 무엇입니까? 'nodes' 변수를 어떻게로드하고 있습니까 (그리고 어떤 유형입니까?)? 아래 L.B 솔루션을 사용하면 "Node"가 아닌 "Name"을 선택 하시겠습니까? (비록 내가 여전히 LINQPad에서 둘 다 사용하여 정답을 얻는다.) – SPFiredrake

+0

.NET 4. 이상하지만 작동하지 않는다. –

+0

@ WildGoat 내 편집보기 –

답변

5
XDocument xDoc = XDocument.Load(....); 
var names = xDoc.Descendants("Name").Select(x => x.Value); 

--EDIT--

XDocument xDoc = XDocument.Load(....); 
XNamespace ns = XNamespace.Get("http://tempuri.org/DataSourceSchemaConfig.xsd"); 
var names = xDoc.Descendants(ns+"Name").Select(x => x.Value); 
+0

어떤 이유로 솔루션이 작동하지 않습니다. Enumeration 결과가 없습니다. –

+0

작동합니다. 이름을 반복 했습니까? 또는 ToList()를 끝에 추가하려고 시도 했습니까? –

+0

@WildGoat : xml이 문자열 변수 인 경우 XDocument.Parse (xml) – Phil

1

이 시도 :

는 nodesxml는
var lists = (from node in nodesxml.Root.Descendants("Node") 
        select new 
        {Name = node.Element("Name").Value}).ToList(); 

당신 그러나하여 XDocument

1

또 다른 솔루션입니다 (하지 LINQ하지만 작동 네임 스페이스 무관) :

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlstring); 
XmlNodeList nlist = doc.SelectNodes("/*[local-name(.)='Root']/*[local-name(.)='Node']/*[local-name(.)='Name']/text()"); 
var list = new List<string>(nlist.Cast<XmlNode>().Select(x => x.Value)); 

XmlNamespaceManager를 사용하여 기본 네임 스페이스를 지정할 수 없기 때문에 XPath가 DefaultNamespace 문제를 처리합니다.