我正在计算XML文件中相同标记名存在的次数。具有相同标记名的每个元素块在内容方面都彼此不同,这就是为什么我将每个元素块保存在不同的字典,数组或任何可以容纳值的数据容器中的原因。词典的数量取决于标记名计数值。
创建字典,标记名搜索,计数
XML文件
<Channel>
<Ch name='1'>
<Name></Name>
<Values></Values>
</Ch>
<Ch name='2'>
<Name></Name>
<Values></Values>
</Ch>
<Ch name='3'>
<Name></Name>
<Values></Values>
</Ch>
</Channel>
源代码
//Using dictionary
Dictionary<string, XmlNodeList> chDictionary = new Dictionary<string, XmlNodeList>
XmlNodeList chNode = doc.GetElementByTagName("Ch");
int count = chNode.Count;
foreach (XmlElement node in chNode)
{
chDictionary.Add(node.GetAttribute("Name"), node.ChildNodes);
}
//Using Array
XmlNode[] array
XmlNodeList chNode = doc.GetElementByTagName("Ch");
int count = chNode.Count;
foreach (XmlElement node in chNode)
{
array = new List<XmlNode>(Migrate<XmlNode>(node.Attributes("Name"),node.ChildNodes)).ToArray();
}
//Gets the values of the Childnodes only not including the attribute name
//of the CH block, then throws it away after the loop.
//The last data would be the last CH Block it could find.
public static IEnumerable<T> Migrate<T>(string v, Systems.Collections.IEnumerable enumerable)
{
foreach(object current in enumerable)
{
yield return (T) current;
}
}
查找并计算CH标记名 根据计数填充字典
答案 0 :(得分:0)
示例XML
<Channel>
<Ch name='1'>
<Name>CH1</Name>
<Values>A</Values>
</Ch>
<Ch name='2'>
<Name>CH2</Name>
<Values>B</Values>
</Ch>
<Ch name='3'>
<Name>CH3</Name>
<Values>C</Values>
</Ch>
</Channel>
代码
我假设您的Ch
元素仅包含Name
作为其第一个元素,而Value
作为其最后一个元素。
如果旁边还有其他元素,则必须遍历其ChildNodes
以查找具有Name
属性等于"Name"
或"Value"
的元素
请注意,XML标记名称区分大小写,因此在调用"Ch"
时必须使用"CH"
而不是GetElementsByTagName
。
Dictionary<string, string> chDictionary = new Dictionary<string, string>();
// I notice that you have "CH" as your element name here
// It should be "Ch" like below
XmlNodeList chNodes = xmlDocument.GetElementsByTagName("Ch");
int chCount = chNodes.Count;
foreach (XmlElement chNode in chNodes)
{
chDictionary.Add(
chNode.FirstChild.InnerText,
chNode.LastChild.InnerText);
}
结果
它会产生您期望的结果吗?让我知道是否有帮助。
答案 1 :(得分:0)
对于给定的键,您不能在一个字典中存储多个元素,但是您可以声明该键的值是可以存储多个值的存储集合:
//how NOT to store multiple values under one key
var dict = new Dictionary<string, string>();
dict.Add("ch", "one");
dict.Add("ch", "two"); //duplicate key exception
dict["ch"] = "two"; //replaces "one"
//how to store multiple values under one key
var dict = new Dictionary<string, List<string>>();
if(!dict.ContainsKey("ch"))
dict.Add("ch", new List<string>());
dict["ch"].Add("one"); //get the list, Add "one" to the list, not the dictionary
dict["ch"].Add("two");
但是在这里,您只选择一种标签(Ch),那么为什么还要麻烦字典呢?从一开始就将它们放在一个简单列表中