首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ从XML中提取属性

使用LINQ从XML中提取属性
EN

Stack Overflow用户
提问于 2015-05-06 11:34:26
回答 2查看 465关注 0票数 2

我有一个XML文件,我试图从该文件中提取一些信息,其中包含了产品及其属性的列表。我试图为Tekla创建3D模型,所以只有其中一些属性与我相关。我之前的实习生是用手做的。我的问题是,有10个文件,每个文件超过100 My大。我不想浪费我生命中很大一部分时间来筛选100多万行代码。以下是Xml文件中每个Product的基本设置。

代码语言:javascript
复制
  <Product ID="productID" UserTypeID="USERTYPE">
    <Name>PRODUCT NAME</Name>
      <ClassificationReference ClassificationID=" CLASSIFICATION_PARKING"  Type="LINK_TYPE_CLASSIFICATION_SYSTEM"/>

    <Values>
      <Value AttributeID="CHA_STREETPRICE_STD_NETAMOUNT">0.00</Value>
      <Value AttributeID="CHA_SAP_MATMAS_WERKS">0000</Value>
      <Value AttributeID="CHA_STREETPRICE_STD_CURRENCY">EUR</Value>
      <Value AttributeID="CHA_SAP_MATMAS_ZZPUBLISH">00000</Value>
      <Value AttributeID="CHA_SAP_MATMAS_ZZCATALOG_TYPE">00000</Value>
      <Value AttributeID="CHA_SAP_MATMAS_MARM_PCE_MEINH">0000</Value>
      <Value AttributeID="CHA_STREETPRICE_STD_QUANTITY">1</Value>
      <Value AttributeID="CHA_SAP_MATMAS_MARM_PCE_UMREZ">1</Value>
      <Value AttributeID="CHA_SAP_MATMAS_ZZDISCGRP">000000</Value>
      <Value AttributeID="CHA_STREETPRICE_STD_NETPRICE">0.00</Value> 
    </Values>
  </Product>

我刚发现LINQ,但我想它也许能帮到我。我的问题是,我似乎只知道LINQ和XML的基础知识。我的头脑中有一种基本的方法,但我不太清楚如何编写查询。我是这么想的:

我只需要某些USERTYPE的产品,所以我会忽略没有USERTYPE的所有Product

然后,我想提取产品属性"ID“和"USERTYPE”以及Name节点。

然后根据Values节点提取attributeID节点中的值。我不想要所有的属性只是一些。

写入单行上的文本文件。然而,我在第一步就被绊倒了。我有这样的疑问:

代码语言:javascript
复制
// find Products with USERTYPE "PRD"    

  static IEnumerable<string>GetKeyWordNames(string file)
            {
                return XDocument.Load(file)
                    .Descendants("Product")
                    .Attributes("ID")      // how do you write a query to select multiple attributes
                    .Select(attr => attr.Value)
                    .ToList();
            }  

以下是我想要达到的目标:

代码语言:javascript
复制
if(Attributes[0] == "ID"&& Attributes[1].Value = "thisValue")
select(product);  

不幸的是,我不太确定如何用LINQ实现这一点。因此,简单来说,我的问题是:

如何查询多个属性,并仅根据属性类型选择产品?

如何基于Values查询AttributeID节点。ValuesProduct的后代还是innerNode的后代?

我是如何存储结果的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-06 12:23:15

就我所理解的问题而言,这是您想要的(除了值中的AttributeId属性):-

我只需要某些USERTYPE的产品,所以我会忽略所有的产品元素,而不是USERTYPE

您需要过滤数据,因此需要一个.Where方法。

在此之后,我们所做的就是投影产品节点中的元素。

代码语言:javascript
复制
List<Product> result = xdoc.Descendants("Product")
                           .Where(x => (string)x.Attribute("UserTypeID") == "1")
                           .Select(x => new Product
                           {
                              ProductId = (string)x.Attribute("ID"),
                              UserTypeID = (string)x.Attribute("UserTypeID"),
                              ProductName = (string)x.Element("Name"),
                              ValuesIds = x.Descendants("Value")
                                         .Select(z => (string)z.Attribute("AttributeID"))
                                         .ToList()
                           }).ToList();

在这里,我认为产生的Product类型如下:-

代码语言:javascript
复制
public class Product
    {
        public string ProductId { get; set; }
        public string UserTypeID { get; set; }
        public string ProductName { get; set; }
        public List<string> ValuesIds { get; set; }
    }

我不想要所有的属性只是一些。

您还没有指定要从什么基础上获取Values节点中的Values属性,这就是为什么我要全部获取它们的原因。

票数 1
EN

Stack Overflow用户

发布于 2015-05-06 12:22:52

我这里没有Visual可以尝试,但我认为您可以使用Where来实现您想要的结果。

代码语言:javascript
复制
XDocument.Load(file)
         .Descendants("Product")
         .Where(element => element.Attribute("ID") != null && element.Attribute("ID").Value == "thisValue")
         .ToList();

它将返回具有指定ID属性的"Product“节点列表。不知道它是否有效,但类似的事情。

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

https://stackoverflow.com/questions/30075530

复制
相关文章

相似问题

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