将 Linq to Xml 与 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);
}
当我使用 theXml 的第一个值时,结果为 null,而使用第二个值时,我有很好的值...
如何将 Linq to Xml 与 xmlns 值一起使用?
I have this code :
/*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);
}
When I use the first value for theXml, the result is null, whereas with the second one, I have good values ...
How to use Linq to Xml with xmlns values ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Descendants
和Element
等 LINQ to XML 方法采用XName
作为参数。从string
到XName
的转换会自动为您进行。您可以通过在Descendants
和Element
调用中的字符串之前添加XNamespace
来解决此问题。请注意,因为您有 2 个不同的命名空间在工作。注意在
后代
中使用ns和在Elements
中使用nsaLINQ to XML methods like
Descendants
andElement
take anXName
as an argument. There is a conversion fromstring
toXName
that is happening automatically for you. You can fix this by adding anXNamespace
before the strings in yourDescendants
andElement
calls. Watch out because you have 2 different namespaces at work.Notice the use of ns in
Descendants
and nsa inElements
您可以将带有命名空间的 XName 传递给后代() 和 Element()。当您将字符串传递给 Descendants() 时,它会隐式转换为没有命名空间的 XName。
要在命名空间中创建 XName,您需要创建一个 XNamespace 并将其连接到元素 local-name(字符串)。
还有一种简写形式,用于通过字符串的隐式转换来创建带有命名空间的 XName。
或者,您可以查询 XElement。Name.LocalName 。
You can pass an XName with a namespace to Descendants() and Element(). When you pass a string to Descendants(), it is implicitly converted to an XName with no namespace.
To create a XName in a namespace, you create a XNamespace and concatenate it to the element local-name (a string).
There is also a shorthand form for creating a XName with a namespace via implicit conversion from string.
Alternatively, you could query against XElement.Name.LocalName.
我在 XML 文档的顶部列出了几个名称空间,我并不真正关心哪些元素来自哪个名称空间。我只想按元素的名称获取元素。我写了这个扩展方法。
I have several namespaces listed at the top of an XML document, I don't really care about which elements are from which namespace. I just want to get the elements by their names. I've written this extension method.
我发现以下代码可以很好地读取 VB.NET 中具有命名空间的属性:
希望这对以后的人有所帮助。
I found the following code to work fine for reading attributes with namespaces in VB.NET:
Hope this helps someone down the road.