首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用内部节点解析XML?

用内部节点解析XML?
EN

Stack Overflow用户
提问于 2010-11-24 05:37:21
回答 3查看 607关注 0票数 4

我有一个XML文件,如下所示:

代码语言:javascript
复制
 <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

所以一开始我在想:

代码语言:javascript
复制
    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();
        }

但它似乎不起作用,我也不确定如何调试它。

从我得到的第一个错误,我相信它可能来自node.Descendants("trade_info"),因为一些客户端根本没有trade_info。

我也相信有以下几点建议:

代码语言:javascript
复制
Id = n.Element("tab_list").Element("data").Element("tab").Value,
Buy = n.Element("buy_price_rate").Value

因为有时他们在列表或buy_price_rate上没有项目。

  • 如何在我的查询中检查它是否为null?
  • 是我想要的查询确定了吗?
  • 我应该更改什么?建议?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-24 06:35:47

你也可以这么做..。

代码语言:javascript
复制
  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
               }
             };

最主要的是映射包装类的外观,并计算出在没有特定属性数据的情况下,缺省值应该是什么。(在本例中我选择了空)

票数 3
EN

Stack Overflow用户

发布于 2010-11-24 05:45:50

您的值doc应该是XElement类型的,然后您可以选择类似的id

代码语言:javascript
复制
var query = from el in doc.Descendants(XName.Get("id"))
 select el.Value;

使用XName并不是必需的,您可以只使用一个字符串,但是如果您的xml在某些元素上有名称空间,则很有用。

票数 2
EN

Stack Overflow用户

发布于 2010-11-24 06:03:22

能否将查询的trade部分更改为:

代码语言:javascript
复制
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)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4263786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档