我有一个XML文件,正在尝试从中提取一些信息。该文件包含产品及其属性的列表。我正在尝试为Tekla创建3D模型,因此只有其中一些属性与我相关。我之前的实习生是手动进行的。我的问题是有10个文件,每个文件都超过100MB。我不愿意浪费大量时间筛选超过一百万行代码。这是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
然后,我想与Name
节点一起提取产品属性“ ID”和“ USERTYPE” 。
然后根据提取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
。是innerNodeValues
的后代Product
吗?
我如何存储所说的结果。
据我了解您的问题,这就是您想要的(“AttributeId
值”中存在的属性除外):
我只需要某些USERTYPE的产品,因此如果没有该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; }
}
我不希望所有属性都是某些。
您尚未指定要基于什么基础来获取节点中AttributeID
存在的属性,Values
这就是为什么我要全部获取它们的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句