Linq to XML,为某个表单的每个不同元素创建一个新的自定义类

时间:2012-04-19 16:45:23

标签: c# xml linq xml-parsing linq-to-xml

我有一个奇怪的问题。我无法以任何方式修改我需要使用的XML(这导致我的问题)。我正在处理的XML采用以下形式:

<DocumentRoot>
   <Parent>
      <ClassAttribute> Value </ClassAttribute>
      <ClassName> More Attributes </ClassName> <!--Can occur a varying number of times.-->
   </Parent>
   <Parent>
      <ClassAttribute> Value </ClassAttribute>
      <ClassName> More Attributes </ClassName>
      <ClassName> More Attributes </ClassName>
   </Parent>
</DocumentRoot>

我想要做的是提取此信息,并使用它来实例化自定义类CustomClassName,然后将其添加到List<CustomClassName>,其中每个不同 {{1 XML文档中的元素(非值)用于创建以下形式的新CustomClassName:

<ClassName>

我希望我已经清楚地解释了我的愿望,如果没有,请戳我以获取更多信息。

是否可以这样做?

编辑:

每个“distinct”ClassName元素,我的意思是元素ClassName将在XML文档中出现多次,尽管我希望只有一个ClassName类可以用它的相关属性(ClassAttribute元素的值)实例化)和不同的ClassName元素的值被“附加”到实例化类中的属性的末尾。

2 个答案:

答案 0 :(得分:0)

试试这个

from n in doc.Root.Elements("Parent") select 
{
ClassName = n.Element("ClassName").First().Attribute("ATTRNAME").Value,
classAttributes = from a in n.Elements("ClassAttribute") select a.Value,
moreAttributes  = from a in n.Elements("ClassName") select a.Value
}

答案 1 :(得分:0)

XElement root = XElement.Load(file); // or .Parse(string)
List<CustomClassName> list = root.Descendants("ClassName").Select(x =>
new CustomClassName()
{
    ClassName = x.Name.LocalName, // is the name, not the value    
    classAttributes = x.Parent.Element("ClassAttribute").Value, // Value is a string, not a list, you'll have to do the conversion.
    moreAttributes = x.Value // is the value, but Value is a string, not a list, you'll have to do the conversion.
})
.ToList();

这没有多大意义,为什么要将<ClassName>元素的名称中的字符串“ClassName”分配给自定义类中的ClassName变量。但是没有更多的xml,它不可能比这更容易理解。

我希望无论如何这对你有所帮助。诀窍是Descendants("ClassName")然后每个节点的Parent.Element("ClassAttribute")获取其属性。