用Xml命名空间使用Linq到Xml

我有这个代码:

/*string theXml = @"<Response xmlns=""http://myvalue.com""><Result xmlns:a=""http://schemas.datacontract.org/2004/07/My.Namespace"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><a:TheBool>true</a:TheBool><a:TheId>1</a:TheId></Result></Response>";*/ string theXml = @"<Response><Result><TheBool>true</TheBool><TheId>1</TheId></Result></Response>"; XDocument xmlElements = XDocument.Parse(theXml); var elements = from data in xmlElements.Descendants("Result") select new { TheBool = (bool)data.Element("TheBool"), TheId = (int)data.Element("TheId"), }; foreach (var element in elements) { Console.WriteLine(element.TheBool); Console.WriteLine(element.TheId); } 

当我使用XML的第一个值,结果是空的,而与第二个,我有很好的价值…

如何使用xmlns值使用Linq到Xml?

LINQ to XML方法(如DescendantsElementXName作为参数。 从stringXName的转换会自动为您执行。 您可以通过在DescendantsElement调用中的string之前添加XNamespace来解决此问题。 小心,因为你有两个不同的命名空间在工作。

string theXml = @"true1"; //string theXml = @"true1"; XDocument xmlElements = XDocument.Parse( theXml ); XNamespace ns = "http://myvalue.com"; XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace"; var elements = from data in xmlElements.Descendants( ns + "Result" ) select new { TheBool = (bool) data.Element( nsa + "TheBool" ), TheId = (int) data.Element( nsa + "TheId" ), }; foreach ( var element in elements ) { Console.WriteLine( element.TheBool ); Console.WriteLine( element.TheId ); }
string theXml = @"true1"; //string theXml = @"true1"; XDocument xmlElements = XDocument.Parse( theXml ); XNamespace ns = "http://myvalue.com"; XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace"; var elements = from data in xmlElements.Descendants( ns + "Result" ) select new { TheBool = (bool) data.Element( nsa + "TheBool" ), TheId = (int) data.Element( nsa + "TheId" ), }; foreach ( var element in elements ) { Console.WriteLine( element.TheBool ); Console.WriteLine( element.TheId ); } 

请注意在Descendants使用ns,在Elements使用nsa

您可以将名称空间的XName传递给Descendants()和Element() 。 将string传递给Descendants()时,它将隐式转换为不带名称空间的XName。

要在名称空间中创buildXName,请创build一个XNamespace并将其连接到元素local-name(一个string)。

 XNamespace ns = "http://myvalue.com"; XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace"; var elements = from data in xmlElements.Descendants( ns + "Result") select new { TheBool = (bool)data.Element( nsa + "TheBool"), TheId = (int)data.Element( nsa + "TheId"), }; 

还有一个简单的forms,通过从string的隐式转换来创build一个名称空间的XName。

 var elements = from data in xmlElements.Descendants("{http://myvalue.com}Result") select new { TheBool = (bool)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheBool"), TheId = (int)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheId"), }; 

或者,您可以针对XEl​​ement进行查询。 Name.LocalName 。

 var elements = from data in xmlElements.Descendants() where data.Name.LocalName == "Result" 

我发现下面的代码在VB.NET中使用命名空间读取属性时可以正常工作:

 MyXElement.Attribute(MyXElement.GetNamespaceOfPrefix("YOUR_NAMESPACE_HERE") + "YOUR_ATTRIB_NAME") 

希望这可以帮助路上的人。

我在XML文档的顶部列出了几个名称空间,我并不关心哪些元素来自哪个名称空间。 我只是想通过他们的名字得到元素。 我已经写了这个扩展方法。

  /// <summary> /// A list of XElement descendent elements with the supplied local name (ignoring any namespace), or null if the element is not found. /// </summary> public static IEnumerable<XElement> FindDescendants(this XElement likeThis, string elementName) { var result = likeThis.Descendants().Where(ele=>ele.Name.LocalName==elementName); return result; }