У меня есть этот код:
/*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, результат является пустым, тогда как со вторым, у меня есть хорошие значения...
Как использовать Linq для Xml со значениями xmlns?
Методы LINQ to XML, такие как Потомки
и Элемент
, принимают XName
в качестве аргумента. . Преобразование из строки
в XName
происходит автоматически. Вы можете исправить это, добавив XNamespace
перед строками в ваших вызовах Descendants
и Element
. Остерегайтесь, потому что у вас работают 2 разных пространства имен.
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 );
}
Обратите внимание на использование ns в Descendants
и nsa в Elements
Вы можете передать XName с пространством имен в Descendants () и ] Элемент () . Когда вы передаете строку в Descendants (), она неявно преобразуется в XName без пространства имен.
Чтобы создать XName в пространстве имен, вы создаете XNamespace и связываете его с локальным именем элемента (строкой).
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"),
};
Существует также сокращенная форма для создания 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"),
};
В качестве альтернативы вы можете запросить XElement. Name.LocalName .
var elements = from data in xmlElements.Descendants()
where data.Name.LocalName == "Result"