如何解决C#:如何读取 xml 元素和子元素的属性
我有一个 xml 文件,其结构在附录中。我正在尝试用 C# 编写一个函数,它应该执行以下操作:将所有元素和子元素排列在不同的列表中,以便为每个组件 (comp) 和每个框 (cast) 几何参数 (GeoVar) 和道具参数 (prop) 被读出并且它们从属于演员表或组合或产品。这必须通过 PNr 完成。如何将父元素的 PNr 分配给 GeoVar 元素或 prop 元素?我不知道该怎么做!谢谢你的帮助...
预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<Product name="vision" PNr="170000">
<GeoVar>
<b>3950.0</b>
<h>3000.0</h>
<t>2500.0</t>
<x>3950.0</x>
<y>1750.5</y>
<z>250.0</z>
</GeoVar>
<Prop>
<typ>t1</typ>
<temp>45</temp>
<vol>22</vol>
<class>2</class>
<year>2010</year>
</Prop>
<Cast name="C1" PNr="170001">
<GeoVar>
<b>3950.0</b>
<h>3000.0</h>
<t>2500.0</t>
</GeoVar>
<Prop>
<typ>t1</typ>
<temp>50</temp>
<vol>2</vol>
<face>f2</face>
<task>t55</task>
<class>2</class>
<year>2010</year>
</Prop>
<Comp name="ZU-RevCHAMBER_2" typ="CHAMBER_ILS2" PNr="160502">
<GeoVar>
<b>3125.0</b>
<h>3010.0</h>
<t>2000.0</t>
</GeoVar>
<Prop>
<typ>t1</typ>
<face>f2</face>
<task>t55</task>
<class>2</class>
<year>2010</year>
<srf>20</srf>
</Prop>
</Comp>
<Comp name="ZU-RevCHAMBER_3" typ="CHAMBER_ILS3" PNr="160503">
<GeoVar>
<b>3125.0</b>
<h>3010.0</h>
<t>2000.0</t>
</GeoVar>
<Prop>
<typ>t1</typ>
<face>f2</face>
<task>t55</task>
<class>2</class>
<year>2010</year>
<srf>20</srf>
</Prop>
</Comp>
<Comp name="ZU-RevCHAMBER_4" typ="CHAMBER_ILS4" PNr="160504">
<GeoVar>
<b>3115.0</b>
<h>3010.0</h>
<t>2010.0</t>
</GeoVar>
<Prop>
<typ>t1</typ>
<face>f2</face>
<task>t55</task>
<class>2</class>
<year>2010</year>
<srf>20</srf>
</Prop>
</Comp>
</Cast>
<Cast name="C5" PNr="175001">
<GeoVar>
<b>2999.0</b>
<h>1560.0</h>
<t>2110.0</t>
</GeoVar>
<Prop>
<typ>wh</typ>
<temp>50</temp>
<vol>021</vol>
<face>z12</face>
<task>txx</task>
<class>2</class>
<year>2009</year>
</Prop>
<Comp name="ZU-RevCHAMBER_12" typ="CHAMBER" PNr="160012">
<GeoVar>
<b>3125.0</b>
<h>3010.0</h>
<t>2000.0</t>
</GeoVar>
<Prop>
<typ>t1</typ>
<face>f2</face>
<task>t55</task>
<class>2</class>
<year>2010</year>
<srf>20</srf>
</Prop>
</Comp>
</Cast>
<Cast name="C6" PNr="175871">
<GeoVar>
<b>2999.0</b>
<h>1560.0</h>
<t>2110.0</t>
</GeoVar>
<Prop>
<typ>wh</typ>
<temp>50</temp>
<vol>021</vol>
<face>z12</face>
<task>txx</task>
<class>2</class>
<year>2009</year>
</Prop>
<Comp name="ZU-RevCHAMBER_12" typ="Typ55" PNr="110502">
<GeoVar>
<b>3125.0</b>
<h>3010.0</h>
<t>2000.0</t>
</GeoVar>
<Prop>
<typ>t1</typ>
<face>f2</face>
<task>t55</task>
<class>2</class>
<year>2010</year>
<srf>20</srf>
</Prop>
</Comp>
</Cast>
</Product>
解决方法
这是一个创建字典的递归算法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication186
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement root = doc.Root;
Product.GetTree(null,root,null);
Dictionary<string,Product> dict = Product.products
.GroupBy(x => x.PNr,y => y)
.ToDictionary(x => x.Key,y => y.FirstOrDefault());
}
}
public class Product
{
public static List<Product> products { get; set; }
public Product parent { get; set; }
public string name { get; set; }
public string PNr { get; set; }
public string typ { get; set; }
public Dictionary<string,decimal> geoVar { get; set; }
public Dictionary<string,string> prop { get; set; }
public List<Product> casts { get; set; }
public List<Product> components { get; set; }
public static void GetTree(Product newProduct,XElement element,Product parent)
{
if (products == null) products = new List<Product>();
if (newProduct == null) newProduct = new Product();
products.Add(newProduct);
newProduct.parent = parent;
newProduct.name = (string)element.Attribute("name");
newProduct.PNr = (string)element.Attribute("PNr");
newProduct.typ = (string)element.Attribute("typ");
newProduct.geoVar = element.Element("GeoVar").Elements()
.GroupBy(x => x.Name.LocalName,y => (decimal)y.FirstOrDefault());
newProduct.prop = element.Element("Prop").Elements()
.GroupBy(x => x.Name.LocalName,y => (string)y.FirstOrDefault());
foreach (XElement comp in element.Elements("Cast"))
{
if (newProduct.casts == null) newProduct.casts = new List<Product>();
Product cast = new Product();
newProduct.casts.Add(cast);
GetTree(cast,comp,newProduct);
}
foreach (XElement comp in element.Elements("Comp"))
{
if (newProduct.components == null) newProduct.components = new List<Product>();
Product component = new Product();
newProduct.components.Add(component);
GetTree(component,newProduct);
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。