如何使用linq替换条件选择元素中的xml内容(VB 2008)

时间:2009-03-22 18:00:13

标签: xml vb.net linq linq-to-xml

我正在开发一个.NET应用程序(VB 2008),它从基于Web的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>来表示Null值,例如,在<field type="DateField" name="archive_date"><None></None></field>中代码块的底部。 <None></None>告诉我,在数据库中,此字段具有空值。此XDocument中的其他<object>元素可能包含有效日期或<None></None>。我想要做的是:对于<object>包含<field type="DateField" name="archive_date"> <None></None>的所有{{1}},用1899-01-01替换此空表示。

我将如何实现这一目标?

感谢。

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样?

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。但我猜这些相似之处可能会让你指向正确的方向。