我有一个包含15个MyObject的现有List<MyObject>
。我想阅读XML文档并将XML文档映射到这些数据。
MyObject类有3个公共属性;
+id :int
+value1 :float
+value2 :float
XML文档具有这种结构;
<root>
<objects>
<object id="1">
<value1>S</value1>
<value2>B</value2>
</object>
<object id="2">
<value1>A</value1>
<value2>J</value2>
</object>
</objects>
</root>
虽然原始List<MyObject>
有15个项目,但传入的XML文档只有2个项目,我需要按ID映射XML对象并更改List值。
所以XML文档的数据
object id=1, value1 = s, value2= b
object id=2, value1 = a, value2= j
并且List<MyObject>
项的数据是
object id=1 value1= a, value2 = b
object id=2 value1= c, value2 = d
object id=3 value1= k, value2 = z
object id=4 value1= y, value2 = e
我需要阅读XML文档并将其与现有的List<MyObject>
合并
列表的结果应该是这样的;
object id=1 value1= s, value2 = b
object id=2 value1= a, value2 = j
object id=3 value1= k, value2 = z
object id=4 value1= y, value2 = e
答案 0 :(得分:1)
试试这个
using System.Xml;
...
XmlDocument doc = new XmlDocument();
doc.Load("filename.xml"); //or doc.LoadXml(xmlString);
XmlNodeList objects = doc.GetElementsByTagName("object"); //get list of objects from XML
List<object> myObjects = new List<object> { new object()}; //replace this with your List<object>
for (int i = 0; i < myObjects.Count; i++)
{
foreach (XmlNode o in objects)
{
if (o.Attributes["id"].Value == myObjects[i].id.ToString())
{
myObjects[i].Value1 = o.ChildNodes[0].InnerText;
myObjects[i].Value2 = o.ChildNodes[1].InnerText;
}
}
}
答案 1 :(得分:0)
要进行任何类型的搜索和合并操作,我认为List不是最有效的数据结构,因为大多数搜索操作都将具有O(N)幅度。根据数据集的大小,这可能是坏的或可接受的。
其次,我会覆盖Equals和GetHashCode方法,以便允许任何类型的比较并识别集合中的每个对象以查看是否存在。
我认为List.Contains方法在内部调用这些方法,以便比较对象并查看列表中是否存在对象。
话虽如此,我认为唯一的方法是在单独的集合中读取XML文件,迭代它,查看每个对象是否存在于您拥有的原始集合中,如果存在则替换它。
LINQ查询也可以简化实现。
答案 2 :(得分:0)
你可以用linq来做你的主要地图这里是id,因为根据你的例子你的身份你已经知道的你的xml和你的列表可能是这样的
List<MyObject> myobjectlist = new List<MyObject>();
然后我会从列表对象id为1
中选择所有值MyObject firstobject=(from c in myobjectlist where c.id=1 selec c).FirstOrDefault();
你的xml查询可能是像这样的想法
var query = from node in results.Descendants("objects")
where node.Attribute("id").Value == "1"
select
{
value1 = node.Element("value1").Value,
value2 = node.Element("value2").Value
};
下一步是映射它
firstobject.value1=query.value1;
firstobject.value2=query.value2;
并对id为<1 / p>的对象执行相同操作