我有一个看起来像这样的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 + "|");
}
我发现了无数个如何计算元素中有多少不同子元素的例子,但我需要知道相同的实例数量元素存在。
谁能指出我正确的方向?
答案 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();