2010-11-24 2 views
4

У меня есть XML-файл, как ниже:Анализ XML с внутренними узлами?

<clients> 
    <client> 
    <id>YYYY</id> 
    <name>XXXX</name> 
    <desc>ZZZZ</desc> 
    <trade_info> 
     <tab_list> 
     <data> 
     <tab>book 123</tab> 
     </data> 
     <data> 
     <tab>cook 321</tab> 
     </data> 
     </tab_list> 
     <buy_price_rate>200</buy_price_rate> 
    </trade_info> 
    </client> 
</clients> 

мне нужно извлечь из него id, name, desc и от внутреннего узла trade_info мне нужно data/tab, buy_price_rate.

Так первоначально я думал об этом:

var query = from node in doc.Descendants("client") 
       select new 
       { 
        client = new 
        { 
         Id = node.Element("id").Value, 
         Name = node.Element("name").Value, 
         Desc = node.Element("desc").Value 
        }, 

        trade = from n in node.Descendants("trade_info") 
           select new 
           { 
            Id = n.Element("tab_list").Element("data").Element("tab").Value, 
            Buy = n.Element("buy_price_rate").Value 
           } 
       }; 

     foreach (var item in query) 
     { 
      writeXML.WriteStartElement("tradelist_template"); 
      writeXML.WriteAttributeString("client_id", item.client.Id); 
      foreach (var trade in item.trade) 
      { 
       writeXML.WriteStartElement("tradelist"); 
       writeXML.WriteAttributeString("item_id", trade.Id); 
       writeXML.WriteEndElement(); 
      } 
      writeXML.WriteEndElement(); 
     } 

Но это не похоже на работу, и им не уверены в том, как отлаживать его.

С первой ошибки, которую я получил, Null Expection Я верю, что он может исходить от node.Descendants("trade_info"), так как у некоторых клиентов нет trade_info.

Я также верю, есть некоторые пришедшие от:

Id = n.Element("tab_list").Element("data").Element("tab").Value, 
Buy = n.Element("buy_price_rate").Value 

Как иногда они не имеют элементы в списке или buy_price_rate.

  • Как проверить в моем запросе кастрированный баран он является недействительным или не обеспечить его
  • Является ли мой запрос в порядке, что я хочу?
  • Что я должен изменить? Советы?

ответ

3

вы также можете сделать это ....

var list = from item in doc.Descendants("client") 
      let tradeinfoelement = item.Element("trade_info") 
      select new 
      { 
       Client = new 
       { 
       Id = (string)item.Element("id"), 
       Name = (string)item.Element("name"), 
       Desc = (string)item.Element("desc") 
       }, 
       TradeInfo = new 
       { 
       BuyPrice = tradeinfoelement.Element("buy_price_rate") != null ? (int?)tradeinfoelement.Element("buy_price_rate") : null, 
       Tabs = tradeinfoelement.Descendants("tab") != null ? tradeinfoelement.Descendants("tab").Select(t => (string)t).ToList() : null 
       } 
      }; 

Главное, чтобы наметить то, что ваш класс упаковка выглядит и работает, что ваши значения по умолчанию должны быть в случае, если нет данных для конкретного свойства, которое вы наберете. (Я выбрал нули в этом примере)

2

Ваше значение документ должен типа XElement, то вы можете выбрать id как

var query = from el in doc.Descendants(XName.Get("id")) 
select el.Value; 

с помощью XName не нужно, вы можете просто использовать строку, но полезно, если ваш XML имеет пространство имен на некоторых из элементы.

+0

Мой документ - это XDocument doc = XDocument.Load (файл); `, вы отвечаете, кажется немного расплывчатым для меня, но спасибо. – Prix 2010-11-24 05:48:01

+0

Если вы отправляете код или XML, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «код» (101 010) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! – 2010-11-24 06:00:59

2

Вы можете изменить trade часть вашего запроса на:

trade = from n in node.Descendants("trade_info") 
    select new 
    { 
    Id = (n.XPathSelectElement("tab_list/data/tab") == null) ? null : n.XPathSelectElement("tab_list/data/tab").Value, 
    Buy = (n.Element("buy_price_rate") == null) ? null : n.Element("buy_price_rate").Value 
    } 

..?

(вам нужно добавить using System.Xml.XPath)

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