2011-07-01 55 views
1

我正在尝试将XML文件绑定到DataGrid。我只是绑定了“交易”。我无法弄清的是如何绑定只有空节点的数据。例如,具有“NSmith”的“UserName”的事务没有“CustomerFirst”的值。 我只想要这个孩子被绑定到DataGrid某些节点为空的XML DataGrid

<Root> 

<Header> 
    <value1>0000000</value1> 
    <value2>1</value2> 
    <value3>100.00</value3> 
</Header> 

<Transactions> 
    <Txn> 
    <id></id> 
    <UserName>BSmith</User> 
    <CustomerFirst>Bob</CustomerFirst> 
    ... 
    </Txn> 
    <Txn> 
    <id></id> 
    <UserName>NSmith</User> 
    <CustomerFirst></CustomerFirst> 
    ... 
    </Txn> 
</Transactions> 

</Root> 

这里是我的C#代码:

serverPath = Server.MapPath("App_Data/" + xmlFileName); 
DataSet dsBillPay = new DataSet(); 
dsBillPay.ReadXml(serverPath); 
dgBillPay.DataSource = dsBillPay.Tables[1]; 
dgBillPay.DataBind(); 

的.Tables [1]是选择 “交易”。 现在的问题是选择具有空节点的数据。

预先感谢您。

回答

0

您可以使用Linq-to-Xml过滤掉所有使用值指定的子元素的元素,并仅包含那些缺少数据的元素。

以下示例检索具有空元素但允许AddressTwo为空的用户。

string xmlText = @"<Root> 
        <Header> 
         <value1>0000000</value1> 
         <value2>1</value2> 
         <value3>100.00</value3> 
        </Header> 

        <Transactions> 
         <Txn> 
          <id>1</id> 
          <UserName>BSmith</UserName> 
          <CustomerFirst>Bob</CustomerFirst> 
         </Txn> 
         <Txn> 
          <id>2</id> 
          <UserName>NSmith</UserName> 
          <CustomerFirst></CustomerFirst> 
         </Txn> 
         <Txn> 
          <id></id> 
          <UserName>JSmith</UserName> 
          <CustomerFirst>James</CustomerFirst> 
         </Txn> 
         <Txn> 
          <id>4</id> 
          <UserName>KSmith</UserName> 
          <CustomerFirst>Kevin</CustomerFirst> 
          <AddressTwo></AddressTwo> 
         </Txn> 
        </Transactions> 

        </Root>"; 

var root = XElement.Parse(xmlText); 

    var elementsThatCanBeEmpty = new HashSet<XName> 
            { 
             XName.Get("AddressTwo") 
            }; 

    var transactionsWithoutCustomerFirst = 
     from transactions in root.Elements(XName.Get("Transactions")).Elements() 
     where transactions.Elements().Any 
      (
       el => 
       String.IsNullOrEmpty(el.Value) && 
       !elementsThatCanBeEmpty.Contains(el.Name) 
      ) 
     select transactions; 

foreach(var t in transactionsWithoutCustomerFirst) 
{ 
    Console.WriteLine(t.Element(XName.Get("UserName")).Value); 
} 
+0

感谢您的回复。但是,此XML文件可能不仅仅是CustomerFirst节点为空。 “txn”内共有20个节点可能为空。然后我想将“Txn”绑定到DataGrid。 – Turp

+0

有没有简单的说法,如果“UserName或CustomerFirst或CustomerLast”是NullOrEmpty,那么这个特定的Txn将在DataGrid中。 – Turp

+0

我们可以排除WHERE语句中的某些字段吗?我们有AddressTwo这不是我们不想检查的要求。 – Turp