Как заменить xml-контент в условно выделенных элементах с помощью linq (VB 2008) - PullRequest
0 голосов
/ 22 марта 2009

Я работаю над приложением .NET (VB 2008), которое получает все свои данные из веб-приложения Django.

Я использую Linq-to-XML и Linq-to-objects в приложении.

Один вызов API дает мне данные XML в следующем формате, который я загружаю в XDocument.

<django-objects version="1.0">
    <object pk="1" model="app.person">
        <field type="CharField" name="reference_num">001</field>
        <field to="app.office" name="office" rel="ManyToOneRel">2</field>
        <field type="DateField" name="date">2008-09-03</field>
        <field type="CharField" name="surname"></field>
        <field type="CharField" name="name">Sandra</field>
        <field type="DateField" name="birthdate">1988-11-03</field>
        <field type="CharField" name="sex">F</field>
        <field type="CharField" name="marital_status">S</field>
        <field type="TextField" name="special_interests">Biking</field>
        <field type="CharField" name="identity_proof"></field>
        <field type="CharField" name="identity_proof_number"></field>
        <field type="BooleanField" name="is_active">0</field>
        <field type="DateTimeField" name="created">2008-09-03 12:46:39</field>
        <field type="DateTimeField" name="modified">2008-09-03 12:46:39</field>
        <field type="DateField" name="important_date"><None></None></field>
        <field type="DateField" name="archive_date"><None></None></field>
        <field type="CharField" name="process_status"></field>
        <field type="FileField" name="image"></field>
        <field to="auth.user" name="self_user" rel="OneToOneRel">13</field>
    </object>
    <object pk="2" model="app.person">
    .
    <!-- more similar xml //-->
    .
    </object>
    .
    .
    .
</django-objects>

В этом формате вызов API возвращает несколько <object> элементов, подобных этому. Этот XML содержит <None></None> для представления нулевых значений, например, внизу в блоке кода выше, в <field type="DateField" name="archive_date"><None></None></field>. <None></None> говорит мне, что в базе данных это поле имеет нулевое значение. Другие элементы <object> в этом XDocument могут иметь действительные даты или <None></None>. Я хотел бы сделать следующее: для всех <object>, где <field type="DateField" name="archive_date"> содержит <None></None>, заменить это нулевое представление на 1899-01-01.

Как мне добиться этого?

Спасибо.

1 Ответ

1 голос
/ 22 марта 2009

Как насчет этого?

XElement djangoElement = XElement.Load(@"c:\django.xml");

IEnumerable<XElement> archiveDateElements = from fieldElement in djangoElement.Elements("object").Elements("field")
                                            where fieldElement.Attribute("type") != null && 
                                                fieldElement.Attribute("type").Value == "DateField" &&
                                                fieldElement.Attribute("name") != null &&
                                                fieldElement.Attribute("name").Value == "archive_date"
                                        select fieldElement;

foreach (var archiveDateElement in archiveDateElements)
{
    XElement noneElement = archiveDateElement.Element("None");

    if (noneElement != null)
    {
        noneElement.ReplaceWith("1899-01-01");
    }
}

P.S. Извините - только что заметил, что это был VB.NET вы были после. Но я думаю, что сходство таково, что оно может указать вам правильное направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...