c# - 使用 LINQ 从 XML 中提取属性

标签 c# xml linq

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

  <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

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

然后提取 Values 中的值节点基于 attributeID .我不想要所有属性,只想要一些。

在一行中写入一个文本文件。 但是,我在第一步绊倒了。我有这个查询:

// 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();
            }  

这是我要实现的目标:

if(Attributes[0] == "ID"&& Attributes[1].Value = "thisValue")
select(product);  

不幸的是,我不太确定如何使用 LINQ 实现这一点。 所以我的问题简而言之是:

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

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

我如何存储上述结果。

最佳答案

据我了解你的问题,这就是你想要的(值中存在的 AttributeId 属性除外):-

I only need products of certain USERTYPE so I'd ignore all Product Elements without that USERTYPE

你需要过滤数据所以你需要一个.Where方法。

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

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 类型是这样的:-

public class Product
    {
        public string ProductId { get; set; }
        public string UserTypeID { get; set; }
        public string ProductName { get; set; }
        public List<string> ValuesIds { get; set; }
    }

I don't want all attributes just some.

您还没有指定要获取 Values 节点中存在的 AttributeID 属性的依据,这就是我要全部获取它们的原因。

关于c# - 使用 LINQ 从 XML 中提取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30075530/

相关文章:

c# - 具有异步/等待的 ContextBoundObject

c# - 如何跨类使用TraceSource

c# - 我无法从类调用我的方法来形成

c# - 直接指定Action与Task-Generator与TPL数据流ActionBlock有什么区别?

c# - Visual Studio 程序集与 nuget 包中的 System.Net.Http

android - 处理 SAX 解析器异常

java - 如何找到 XML 中元素的自然顺序?

c# - 使用 LINQ 将 List<U> 转换为 List<T>

c# - LINQ删除错误(C#)

c# - 用于选择要复制的参数的 LINQ 语法