2016-02-24 3 views
0

У меня есть XMLGet XElement из XDocument

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
... 

загружаю XML в XDocument

XDocument xDoc = XDocument.Parse(xmlString); 

и рядом я пытаюсь найти XElement содержит Body

Я попытался

XElement bodyElement = xDoc.Descendants(XName.Get("Body", "s")).FirstOrDefault(); 

или

XElement bodyElement = xDoc.Descendants("Body").FirstOrDefault(); 

или

XElement bodyElement = xDoc.Elements("Body").FirstOrDefault(); 

но bodyElement всегда null.

Если я пытаюсь добавить Namespace

XElement bodyElement = xDoc.Descendants("s:Body").FirstOrDefault(); 

я получил ошибку о :.

Если удалить s из XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
... 

Все работает. KG

Как добраться XElementКузов:?

ответ

3

Вы пытаетесь посмотреть в пространстве имен с URI «s» - у него нет этого URI. URI - "http://schemas.xmlsoap.org/soap/envelope/". Я также предлагаю избегать XName.Get и только с помощью XNamespace и оператор XName +(XNamespace, string):

XNamespace s = "http://schemas.xmlsoap.org/soap/envelope/"; 
XElement body = xDoc.Descendants(s + "Body").FirstOrDefault(); 
+0

спасибо много. Работает отлично. – BWA

+0

@BWA. Если у вас возникли проблемы с получением XML с различными пространствами имен, вы также можете попробовать LocalName: 'xDoc.Descendants(). Где (x => x.Name.LocalName.Equals (" Тело ", StringComparison.Ordinal))' – Crowcoder

+0

@Crowcoder: Если вы собираетесь делать сравнение по порядку, просто используйте '==' ... но сравнение значений LocalName редко бывало хорошим, IMO. –

Смежные вопросы