读取XML并使用C#</t>映射到List <t>数据集

时间:2012-10-21 03:42:08

标签: c# list dataset

我有一个包含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

3 个答案:

答案 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>的对象执行相同操作