我有两个循环从两个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}};
名称将来自BOTH循环,并且将成为对象的“键”。类型和默认值将来自Loop1,值将来自Loop2。串联将使用Name / Col匹配。
PS:我尝试使用2D字符串数组执行此操作,但在尝试将两个匹配的cols和names字段组合时遇到了麻烦。
答案 0 :(得分: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;
}
答案 1 :(得分: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;
}
我希望这能帮助你完成任务。
答案 2 :(得分: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