我有一个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个问题需要高手们帮下忙。
<?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个问题需要高手们帮下忙。
解决方案 »
- 请教个三层架构的查询语句问题!高人进来看看
- C#vs2003 datagrid控制某一行行宽
- 如何得到DataGrid的选中行的第列的值(Windows开发,不是asp.net)
- IIS出现问题,重新安装IIS后,IIS不能识别aspx文件,怎么把他加回去?
- 一个winform程序在intranet运行的问题
- 关于在c#中如何取得存储过程的多个输出参数(在线期待)
- 刚刚学习delegate的一个简单问题
- 求教winform追写excel的问题,感谢大神
- c#解析php发过来的json字符串的问题
- 有模式对话框
- winform中,导入一个Excel并把他保存为dataset时,出现“外部表不是预期的格式”???
- C# 反射
读取XML使用
string xml = @"";
XElement xmlPage = XElement.Parse(xml);
var query = xmlPage.Descendants("").Select(x=>x.Element("").Value).ToList()XmlNode n = xdoc.SelectSingleNode("");
<TableName>
<Item house_code="502" build_code = "2" item_code = "582" .../>
<Item house_code="503" build_code = "3" item_code = "582" .../>
.......
</TableName>
</DataBase>
var query = xmlPage.Descendants("").Select(x=>x.Element("").Value).ToList()
这句话应该怎么填内容合适啊,我在VS2008下,这样写
var query = xele.Descendants("DataRow").Select(x >= x.Element("Items").Value).ToList();
他提示说“无法从用法中推到出方法”,编译错误。还望指教。
<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);
}
不过我主要的问题是怎么去比较值我打算这样做foreach(DataRow oDr in oDt.rows)
{
//这里拿出每一行的值来,去和XML中DataRow节点中的值进行比较
//比较完再进行保存。
}
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;
}
你猜测的对,就是两个行的集合,不过是要DataTable形式的。
"你是不是想把手上的DataTable拆分为两个部分,一部分是和xml中相同内容的数据行集合,另一部分是与xml中内容不同的数据行集合。"
<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格式改正下,不过,如果是这个情况下改怎么比较?还请大家帮帮忙,谢谢。
<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>
改成这样从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;
}
先排序,后比较,这样就可以顺序比较,无需遍历全部,效率自然最高。提示:将排序后的XML数据存放到List中,或者直接加载到DataTable中,使用DataTable的排序方法。
<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>