我有一个XML文档,格式如下:
<?xml version="1.0"?>
<DataTable>
  <DataRow>
    <Item house_code="502" />
    <Item build_code="2" />
    <Item item_code="582" />
    <Item house_id="9193" />
    <Item unit_code="2" />
    <Item purpose_code="住宅" />
    <Item build_area="133.98" />
    <Item inside_area="122.52" />
    <Item house_name="502" />
    <Item aprice="3063.61" />
    <Item total_price="410462.00" />
    <Item current_layer="5" />
    <Item ayer_high="0.00" />
    <Item oper_date="2009-3-22 18:34:50" />
    <Item house_shape="三室两厅" />
    <Item district_code="0020" />
    <Item house_state="2" />
  </DataRow>
  <DataRow>
    <Item house_code="402" />
    <Item build_code="2" />
    <Item item_code="582" />
    <Item house_id="9194" />
    <Item unit_code="2" />
    <Item purpose_code="住宅" />
    <Item build_area="133.98" />
    <Item inside_area="122.52" />
    <Item house_name="402" />
    <Item aprice="3326.00" />
    <Item total_price="445617.00" />
    <Item current_layer="4" />
    <Item ayer_high="0.00" />
    <Item oper_date="2009-3-22 18:34:50" />
    <Item house_shape="三室两厅" />
    <Item district_code="0020" />
    <Item house_state="2" />
  </DataRow>

 </DataTable>我现在有个DataTable,这个DataTable中的列元素与上边XML中DataRow节点中的元素吻合。
也就是说把上边的XML看成一个DataTable的话,两个DataTable的结构是一样的,只是值不同。
我现在就想用DataTable oDt中的每一行数据去查询这个XML文档,将不同的数据和相同的数据保存到两个DataTable中。
请各位高手帮我解决下,我的问题:
1.怎么查询性能最高。
2.具体代码怎么实现。
3.如果用LINQ的话请给详细注释,我看了看MSDN和本论坛的帖子,没看懂关于LINQ部分的form..in..where..select句子。就这3个问题需要高手们帮下忙。

解决方案 »

  1.   

    最好是以DataRow中的没个单元格的值来进行判断条件进行验证。不知道我这样说4楼的是否能明白。
      

  2.   

    dataset..ReadXml
    读取XML使用
    string xml = @"";
    XElement xmlPage = XElement.Parse(xml);   
      var query = xmlPage.Descendants("").Select(x=>x.Element("").Value).ToList()XmlNode n = xdoc.SelectSingleNode("");
      

  3.   

    这涉及到XML的设计了,你可以考虑将表的列在XML中以结点属性方式列出,再解析,一个结点一条记录如:<DataBase>
          <TableName>
            <Item house_code="502" build_code = "2" item_code = "582" .../>
            <Item house_code="503" build_code = "3" item_code = "582" .../>
            .......
          </TableName>
       </DataBase>
      

  4.   

    7楼的朋友,我想请教下,
    var query = xmlPage.Descendants("").Select(x=>x.Element("").Value).ToList()
    这句话应该怎么填内容合适啊,我在VS2008下,这样写
    var query = xele.Descendants("DataRow").Select(x >= x.Element("Items").Value).ToList();
    他提示说“无法从用法中推到出方法”,编译错误。还望指教。
      

  5.   

    你这个 Xml 格式其实是有问题的。应该是下面格式才符合DataTable定义。 <DataTable>
      <DataRow>
        <house_code>502</house_code>
        <build_code>2</build_code>
        <item_code>582</item_code>
        <house_id>9193</house_id>
        ...
      </DataRow>
    </DataTable>
    之前格式的Xml,如果用XPath的话,需要遍历Item匹配上属性,再匹配值
    这样把xml读入DataTable可以用下面的方法: var dt = new DataTable();
     dt.Columns.Add("house_code");
     dt.Columns.Add("build_code");
     dt.Columns.Add("item_code");
     dt.Columns.Add("house_id"); var newDt = dt.Clone();
     var xmlPath = @"Data.xml";
     XDocument xdoc = XDocument.Load(xmlPath);
     foreach (var row in xdoc.Descendants("DataRow"))
     {
         var newRow = newDt.NewRow();
         foreach (var item in row.Elements())
         {
             if (item.HasAttributes)
             {
                 var colName = item.Attributes().FirstOrDefault().Name.LocalName;
                 var colValue = item.Attributes().FirstOrDefault().Value;
                 newRow[colName] = colValue;
             }
         }
         newDt.Rows.Add(newRow);
     }
      

  6.   

    谢谢12楼的回答,你解决了我怎么把数据保存到DataTable中的问题。
    不过我主要的问题是怎么去比较值我打算这样做foreach(DataRow oDr in oDt.rows)
    {
        //这里拿出每一行的值来,去和XML中DataRow节点中的值进行比较
         //比较完再进行保存。
    }
      

  7.   


    foreach (DataRow r in dt.Rows)
    {
        if (FindRowInXml(r, xdoc))
            Console.WriteLine("current row exists");
        else
            Console.WriteLine("current row not exists");
    }static bool FindRowInXml(DataRow dataRow, XDocument xdoc)
    {
        var query = from row in xdoc.Descendants("DataRow")
                    where row.Elements().All(x =>
                    {
                        var colName = x.Attributes().FirstOrDefault().Name.LocalName;
                        var colValue = dataRow[colName].ToString();
                        var attValue = x.Attributes().FirstOrDefault().Value;
                        Console.WriteLine("{0}:{1} -- {2}", colName, colValue, attValue);
                        return colValue == attValue;
                    })
                    select row;    if (query.ToList().Count > 0)
            return true;
        return false;
    }
      

  8.   

    没理解,我猜测下,你是不是想把手上的DataTable拆分为两个部分,一部分是和xml中相同内容的数据行集合,另一部分是与xml中内容不同的数据行集合。因为还有一种可能性是将手上DataTable中与XML文件中相同部分作为一个DataTable存放,不同部分以XML文件中的为准,所以我要确认下。
      

  9.   


    你猜测的对,就是两个行的集合,不过是要DataTable形式的。
    "你是不是想把手上的DataTable拆分为两个部分,一部分是和xml中相同内容的数据行集合,另一部分是与xml中内容不同的数据行集合。"
      

  10.   


    <DataTable>
      <DataRow>
        <house_code>502</house_code>
        <build_code>2</build_code>
        <item_code>582</item_code>
        <house_id>9193</house_id>
        ...
      </DataRow>
    </DataTable>
    谢谢fangxinggood的提出,我已经和相关的人谈过了,他同意把现有的XML格式改正下,不过,如果是这个情况下改怎么比较?还请大家帮帮忙,谢谢。
      

  11.   


    <DataTable name="tableName">
      <Columns>
        <DataColumn Name="house_code" Type="int" />
        <DataColumn Name="build_code" Type="int" />
        <DataColumn Name="item_code" Type="int" />
        <DataColumn Name="house_id" Type="int" />
        ...
      </Columns>
      <Rows>
        <DataRow ItemArray="502,2,582,9193,..."/>
        <DataRow ItemArray="402,2,582,9194,..."/>
        ...
      </Rows>
    </DataTable>
      

  12.   


    改成这样从xml -> Datatable就可以用DataTable.ReadXml了。
    查找匹配和上面我给你方法类似。就是不取Attribute了,直接取Name和Value
    static bool FindRowInXml2(DataRow dataRow, XDocument xdoc)
    {
        var query = from row in xdoc.Descendants("DataRow")
                    // 查找DataRow节点下所有节点(Name=ColumnName)的值和
                      // 传入的DataRow各列值相等。
                    where row.Elements().All(x =>  
                    {
                        var colName = x.Name.LocalName;
                        var colValue = dataRow[colName].ToString();
                        var xmlValue = x.Value;
                        Console.WriteLine("{0}:{1} -- {2}", colName, colValue, xmlValue);
                        return colValue == xmlValue;
                    })
                    select row;    if (query.ToList().Count > 0)
            return true;
        return false;
    }
      

  13.   

    1.怎么查询性能最高。
    先排序,后比较,这样就可以顺序比较,无需遍历全部,效率自然最高。提示:将排序后的XML数据存放到List中,或者直接加载到DataTable中,使用DataTable的排序方法。
      

  14.   

    XML code
    <DataTable name="tableName">
      <Columns>
        <DataColumn Name="house_code" Type="int" />
        <DataColumn Name="build_code" Type="int" />
        <DataColumn Name="item_code" Type="int" />
        <DataColumn Name="house_id" Type="int" />
        ...
      </Columns>
      <Rows>
        <DataRow ItemArray="502,2,582,9193,..."/>
        <DataRow ItemArray="402,2,582,9194,..."/>
        ...
      </Rows>
    </DataTable>