XML DataGrid, где некоторые узлы пусты - PullRequest
1 голос
/ 01 июля 2011

Я пытаюсь привязать файл XML к DataGrid.Я только связываю «Сделки».Что я не могу понять, так это как связать только данные с пустыми узлами .Например, транзакция, в которой «UserName» равно «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 голосов
/ 01 июля 2011

Вы можете использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...