代码之家  ›  专栏  ›  技术社区  ›  Finglas

LinqXML总是那么混乱吗?

  •  6
  • Finglas  · 技术社区  · 15 年前
    var subset = from item in document.Descendants("Id")
                 where item.Value == itemId.ToString()
                 select new PurchaseItem() {
                     Id = int.Parse(item.Parent.Element("Id").Value),
                     Name = item.Parent.Element("Name").Value,
                     Description = item.Parent.Element("Description").Value,
                     Price = int.Parse(item.Parent.Element("Price").Value)
                 };
    

    XML的结构如下:

    <Items>
        <Item>
            <Id></Id>
            <Name></Name>
            <Description></Description>
            <Price></Price>
        </Item>
    </Items>
    

    id和price都是整数值。名称和描述是字符串。

    我找到了 Linq to XML 我用它做的很好,这只是一个片段。但另一方面,我觉得它应该或可能更干净。在这个片段中,演员阵容似乎是最明显的问题。

    有什么建议吗?

    4 回复  |  直到 15 年前
        1
  •  13
  •   Jon Skeet    15 年前

    事实上,在我看来,打电话比打电话要好 int.Parse .以下是我如何编写您的查询:

    string id = itemId.ToString(); // We don't need to convert it each time!
    
    var subset = from item in document.Descendants("Id")
                 where item.Value == id
                 let parent = item.Parent
                 select new PurchaseItem
                 {
                     Id = (int) parent.Element("Id"),
                     Name = (string) parent.Element("Name"),
                     Description = (string) parent.Element("Description"),
                     Price = (int) parent.Element("Price")
                 };
    
        2
  •  1
  •   Mitchel Sellers    15 年前

    我假设您也有一个“items”节点?

    您可以这样做,假设您正在使用xelement.load()加载文档。

    var subset = from item in document.Elements("Item")
                 where item.Element("Id").Value == itemId.ToString()
                 select new PurchaseItem() {
                     Id = int.Parse(item.Element("Id").Value),
                     Name = item.Element("Name").Value,
                     Description = item.Element("Description").Value,
                     Price = int.Parse(item.Element("Price").Value)
                 };
    

    不是更好,但更容易阅读!

        3
  •  1
  •   GraemeF    15 年前

    在您的示例中,您可以通过查找 <Item/> 元素而不是 <Id/> 为了避免 Parent 每一次:

    var subset = from item in document.Descendants("Item")
                 where item.Element("Id").Value == itemId.ToString()
                 select new PurchaseItem()
                            {
                                Id = int.Parse(item.Element("Id").Value),
                                Name = item.Element("Name").Value,
                                Description = item.Element("Description").Value,
                                Price = int.Parse(item.Element("Price").Value)
                            };
    
        4
  •  1
  •   Jay Bazuzi Buck Hodges    15 年前

    考虑为编写新的构造函数 PurchaseItem 它采用XML元素,因此您可以编写:

    select new PurchaseItem(item.Parent);