使用XDocument在XML元素内计算同名的ChildElements

时间:2015-04-21 11:05:17

标签: c# xml

我有一个看起来像这样的XML文件 -

<SST_SignageCompConfig>
  <Items>
    <Item>
      <Index>0</Index>
      <Type>1</Type>
      <Duration>7</Duration>
      <Name>Branding-Colours-for-business.jpg</Name>
    </Item>
    <Item>
      <Index>1</Index>
      <Type>1</Type>
      <Duration>7</Duration>
      <Name>Flower of Life Meditation - Copy.png</Name>
    </Item>
</Items>
</SST_SignageCompConfig>

我需要计算Item元素中有多少Items个元素。
有多少张图片。

我使用XDocument,因此我的XML文件就像这样加载 -

string configurationPath = System.IO.Path.Combine("C:\\SST Software\\DSS\\Compilations\\" + compName + @"\\Comp.cfg");
XDocument filedoc = XDocument.Load(configurationPath);

我尝试了以下各种变体,所有变体都返回null object reference exception

foreach (var item in filedoc.Element("SST_SignageCompConfig").Element("Items").Element("Item").Nodes())
{
    string name = filedoc.Element("SST_SignageCompConfig").Element("Items").Element("Item").Attribute("Name").ToString();
    files.Append(name + "|");
}

我发现了无数个如何计算元素中有多少不同子元素的例子,但我需要知道相同的实例数量元素存在。

谁能指出我正确的方向?

5 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。尝试找出哪个调用正在为您提供NullReferenceException。我的猜测是尝试找到:

.Element("SST_SignageCompConfig")

这是你的根。请尝试以下方法:

// note the difference between .Element and .Elements
var count = filedoc.Root.Element("Items").Elements("Item").Count();

您还可以使用XPath来帮助您确定XDocument中的导航:

// returns the current top level element
var element = filedoc.Root.XPathSelectElement(".");

// If the returned element is "SST_SignageCompConfig", then:
var nextElement = filedoc.Root.XPathSelectElement("./Items")

// If the "." element is *not* "SST_SignageCompConfig", then try and locate where in your XML document that node is. 
// You can navigate up with .Parent and down with .Element(s)

等等。

答案 1 :(得分:2)

您可以选择所有名称:

var names = from item in filedoc.Descendants("Item")
            select (string)item.Element("Name");

或者没有查询语法:

var names = filedoc.Descendants("Item").Elements("Name").Select(e => e.Value);

您只能通过以下方式获取唯一名称:

var uniqueNames = names.Distinct();

答案 2 :(得分:0)

怎么样:

var nav = fileDoc.CreateNavigator();
XPathNodeIterator navShape = nav.Select("/SST_SignageCompConfig/Items");
navShape.MoveNext()
var count = navShape.Count;

答案 3 :(得分:0)

如果您的xml只有一个Items元素,那么这应该可以解决问题:

filedoc.Descendants("Item")
    .GroupBy(e => e.Element("Name")!=null? e.Element("Name").Value:String.Empty)
    .Select(g => new
    {
        Name = g.Key,
        Count = g.Count()
    });

答案 4 :(得分:0)

因为&#34;姓名&#34;是一个元素,而不是xml结构的属性。

你可以尝试替换它吗?

string name = filedoc.Element("SST_SignageCompConfig").Element("Items").Element("Item").Element("Name").ToString();