2011-07-01 15 views
1

XMLファイルをDataGridにバインドしようとしています。私は "取引"を拘束しています。私が理解できないのは、空のノードを持つデータだけをにバインドする方法です。たとえば、 "UserName"が "NSmith"のトランザクションには "CustomerFirst"の値はありません。私はこの子がここでのDataGrid特定のノードが空のXMLデータグリッド

<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