2013-06-21 4 views
1

Рассмотрим следующий XML какПолучить значение узла XML C#

<?xml version="1.0" encoding="UTF-8" ?> 
    <response success="true"> 
     <struct>value</struct> 
    </response> 

при разборе я получаю следующее сообщение об ошибке, как

Root element is missing. 

код, который я использовал был

foreach (XElement carselement in xdoc.Descendants("response")) 
       { 
        String value= carselement.Element("struct").Value; 

       } 

ожидая ваших решений

+3

Как 'xdoc' загруженным и что делает его * действительно * содержат? Я бы предположил, что это * не * представляет этот XML. – user2246674

+0

@ user2246674 ya thats проблема, с которой я столкнулся, могу ли я сделать это другим способом – GowthamanSS

+1

@GowthamanSS ваш код работает без проблем. –

ответ

1

Входной XML-не, как и ожидалось (это «пустой») и исключение происходит во время XDocument.Load (или XDocument.Parse, и т.д.).

В конечном счете xdoc не содержит ожидаемых - и «подозрительные» линии никогда не запускаются; опять же, это исключение возникает, когда XML равен разобранный, а не когда он перечислит/перемещается. Этот сценарий должен быть легко идентифицирован с помощью attached debugger или трассировки стека.

Ниже приведен минимальный код, который может быть запущен в LINQPad в качестве операторов C#. Я изменил его, чтобы отобразить красиво с дампом. Обратите внимание, что работает как ожидалось.

var xmlStr = @"<?xml version=""1.0"" encoding=""UTF-8"" ?> 
    <response success=""true""> 
     <struct>value</struct> 
    </response>"; 
var xdoc = XDocument.Parse(xmlStr); 
xdoc.Descendants("response") 
    .Select(e => e.Element("struct").Value) 
    .Dump(); 

Вот как исключение может быть вызвано (и это не имеет ничего общего с Descendants или другим перечислением/навигацией):

var xmlStr = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>"; 
var xdoc = XDocument.Parse(xmlStr); 
// --> XmlException: Root element is missing 
+0

Красиво сделано! Это было бы так легко отлаживать, не так легко угадать и понять с помощью «карандаша и бумаги», –

0

Может быть, ваш XML является более упрощенным, и выглядит следующим образом:

<!-- example --> 
<?xml version="1.0" encoding="UTF-8" ?> 
<response success="true"> 
    <struct>value1</struct> 
</response> 
<response success="true"> 
    <struct>value2</struct> 
</response> 
<response success="false"> 
    <struct>value3</struct> 
</response> 

В этом случае вам не хватает <responses></responses>, который оборачивается вокруг response массива элементов.

BTW, ваш код также должен работать, если ваш XML-файл действительно то, что вы цитируете здесь. Вы тоже пытаетесь манипулировать XML?

XDocument xdoc = XDocument.Load(filePath); 
if (xdoc == null) return; 

XElement response = xdoc.Descendants("response").FirstOrDefault(); 
XElement structElement = response.Descendants("struct").FirstOrDefault(); 
+2

Обратите внимание, что несколько корневых элементов приводят к «XmlException: существует несколько корневых элементов». – user2246674