某些节点为空的XML DataGrid

时间:2011-07-01 16:50:26

标签: c# asp.net xml data-binding datagrid

我正在尝试将XML文件绑定到DataGrid。我只绑定了“交易”。我无法弄清楚的是如何绑定只有空节点的数据。例如,具有“用户名”“NSmith”的事务没有“CustomerFirst”的值。 我只想将这个孩子绑定到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]正在选择“交易”。 现在的问题是选择具有空节点的数据。

提前谢谢。

1 个答案:

答案 0 :(得分: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);
}