有没有一种方法可以计算重复的XML标记名并将每个标记名存储在不同的字典中?

时间:2019-05-22 02:35:55

标签: c# xml dictionary count

我正在计算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标记名 根据计数填充字典

2 个答案:

答案 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);
}

结果

enter image description here

它会产生您期望的结果吗?让我知道是否有帮助。

答案 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),那么为什么还要麻烦字典呢?从一开始就将它们放在一个简单列表中