0

我有一个现有List<MyObject>的包含 15 个 MyObject(s)。我想读取一个 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
4

3 回答 3

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;
        }
    }
}
于 2012-10-21T04:27:43.147 回答
0

你可以用linq来做你的主地图是id,因为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 的对象执行相同操作

于 2012-10-21T04:17:34.847 回答
0

要进行任何类型的搜索和合并操作,我不认为 List 是最有效的数据结构,因为大多数搜索操作将是 O(N) 量级。根据数据集的大小,这可能是不好的或可以接受的。

其次,我将重写 Equals 和 GetHashCode 方法,以便允许进行任何类型的比较并识别集合中的每个对象以查看是否存在。

我认为 List.Contains 方法在内部调用这些方法以比较对象并查看列表中是否存在对象。

话虽如此,我认为唯一的方法是在单独的集合中读取 XML 文件,对其进行迭代,查看每个对象是否存在于您拥有的原始集合中,如果存在则替换它。

LINQ 查询也可以简化实现。

于 2012-10-21T04:00:13.717 回答