3

我有两个循环从两个 XML 源中提取数据:

循环1:

foreach (XmlNode nodes in node.ChildNodes)
            {
                if (nodes.Name == "DEFAULT")
                    defaults[count] = nodes.InnerText;
                if (nodes.Name == "TYPE"
                    types[count] = nodes.InnerText;
                if (nodes.Name == "COL_NAM"
                    names[count] = nodes.InnerText;

            }
            count++;

循环2:

foreach (XmlNode nodes in root.ChildNodes)
        {
            vals[i] = nodes.InnerText;
            cols[i] = nodes.Name;
            i++;
        }

不知何故,我想将这些数据组织成一个终极对象。该对象需要有 4 个部分:名称、类型、值和默认值。本质上,我想将 Loop1 中的所有内容组合在一起,然后将 Loop2 中的所有内容组合在一起,然后将这两个对象添加到一个对象中,匹配来自 Loop1 的名称和来自 Loop2 的 cols。理想情况下,Loop2 中的节点数量可能少于 Loop1。但是,如果那不可能,我可以解决它。

为了更好地了解最终对象:

object everything = {{names}, {types}, {values}, {defaults}};

名称将来自两个循环,并将成为对象的“关键”。类型和默认值将来自 Loop1,值将来自 Loop2。串联将使用名称/列进行匹配。

PS:我尝试使用 2D 字符串数组来执行此操作,但在尝试组合匹配 cols 和 names 字段的两个时遇到了麻烦。

4

3 回答 3

5

您可以使用Dictionary类并将Name用作对象的键。

例如:

public class MyObj{
  public string Name{get;set;};
  public string Type{get;set;};
  public string Value{get;set;};
  public string Default{get;set;};
}

并修改您的循环以使用它:

var allObjs = new Dictionary<string, MyObj>();   


foreach (XmlNode nodes in node.ChildNodes)
{
  var obj = new MyObj();
    if (nodes.Name == "DEFAULT")
      obj.Default = nodes.InnerText;
    ...
    allObjs.Add(obj.Name, obj);
}

然后在第二个循环中使用键检索现有对象以更新值。像这样的东西:

foreach (XmlNode nodes in root.ChildNodes)
{
  var myObj = allObs[nodes.Name];
  myObj.Value = nodes.InnerText;
}
于 2013-02-20T20:53:12.347 回答
1

好吧,您可以使用 XPath 来选择您的值。

public class Ultimate
{
    public Ultimate(XmlNode node)
    {
       XmlNode child = node.SelectSingleObject("./COL_NAM");
       if (child == null) throw new InvalidArgument("COL_NAM not found");
       Name = child.InnerText;

       XmlNode child = node.SelectSingleObject("./TYPE");
       if (child == null) throw new InvalidArgument("TYPE not found");
       Type = child.InnerText;

       XmlNode child = node.SelectSingleObject("./DEFAULT");
       if (child == null) throw new InvalidArgument("DEFAULT not found");
       Default = child.InnerText;

       XmlNode child = node.SelectSingleObject("./COL_NAM");
       if (child == null) throw new InvalidArgument("COL_NAM not found");
       Name = child.InnerText;

    }
    public string Name;
    public string Type;
    public string Value;
    public string Default;
}

// 读取对象会是这样的:

Dictionary<string, Ultimate> ultimateCollection = new Dictionary<string, Ultimate>();
foreach(XmlNode node in xmlDocument1.SelectNodes("/DATA1"))
{
    Ultimate ultimate = new Ultimate(node);
    ultimateCollection.Add(ultimate.Name, ultimate);
}

foreach(XmlNode node in root.ChildNodes)
{
    Ultimate ultimate;
    if (ultimateCollection.TryGetValue(node.Name, out ultimate))
        ultimate.Values = node.InnerText;
}

我希望这对你的追求有所帮助。

于 2013-02-20T21:35:56.757 回答
0

根据您的描述,我会使用 XElement \ LINQ。 http://codingsense.wordpress.com/2008/09/23/join-xml-using-linq/

..和/或..

将 xml 序列化/反序列化为 C# 对象 http://www.java2s.com/Code/CSharp/XML/XmlSerializationHelper.htm

于 2013-02-20T20:58:11.400 回答