首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于条件Linq到XML创建XML

基于条件Linq到XML创建XML
EN

Stack Overflow用户
提问于 2014-06-05 15:45:25
回答 1查看 488关注 0票数 0

使用Linq到XML相当新,并且在这一项上绞尽脑汁。我使用Xdocument创建XML文档,方法是从数据库中获取一些数据,然后对每个语句使用a,然后添加每一行数据,即

代码语言:javascript
运行
复制
    Dim MyCustomers As IQueryable(Of Customer) = GetCUstomers
    Dim XDoc As XDocument = <?xml version="1.0" encoding="UTF-8" standalone="yes"?<Customers></Customers>

    For Each c As Customer In MyCustomers
    Xdoc.Root.Add(<CustomerID=<%= c.Id %> 
     <FirstName><%= c.Name %></FirstName>
     <Surname><%= c.Surname %></Surname>
    Next

我想要一个If状态,所以如果姓氏是空的,我希望这个元素被完全删除。

因此,如果客户的姓氏存在,XML是

代码语言:javascript
运行
复制
<CustomerID=123> 
<FirstName>Name</FirstName>
<Surname>Surname></Surname>

如果不是

代码语言:javascript
运行
复制
<CustomerID=123> 
<FirstName>Name</FirstName>

我试过用

代码语言:javascript
运行
复制
<%= If (string.IsnullEmpty(c.Surname) Then %>

以及其他的组合,但是无论我尝试什么,我都会得到一个语法错误。我搜索了MSDN,大多数示例都提到了获取节点,但没有根据条件在XML文件中创建节点/元素。我真的迷失在如何接近这一个?

有人能帮忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-05 18:04:58

我认为可能有些代码被弄错了--有一些无效的XML元素,比如<CustomerID=123>,可能应该是<Customer ID=123>。尽管如此,我认为,下面的代码(在LINQPad中运行)可以实现您想要的结果,希望您可以将其修改为您的代码。

代码语言:javascript
运行
复制
Sub Main
    Dim MyCustomers = New List(Of Customer)() From {
        New Customer() With { .ID = 1, .Name = "Cust1", .Surname = "Surn1" },
        New Customer() With { .ID = 2, .Name = "Cust2" },
        New Customer() With { .ID = 3, .Name = "Cust3", .Surname = "Surn3" },
        New Customer() With { .ID = 4, .Name = "Cust4" }
    }
    Dim Xdoc = <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Customers></Customers>
    For Each c As Customer In MyCustomers
        Dim cust = 
            <Customer ID=<%= c.Id %>>
                <FirstName><%= c.Name %></FirstName>
            </Customer>
        If c.Surname IsNot Nothing Then
            cust.Add(<Surname><%= c.Surname %></Surname>)
        End If
        Xdoc.Root.Add(cust)
    Next
    Xdoc.Dump()
End Sub

' Define other methods and classes here
Public Class Customer
    Public Property ID As Integer
    Public Property Name As String
    Public Property Surname As String
End Class

更新

下面是上面的循环,但是使用嵌入式LINQ查询来有选择地添加<Surname>元素。就我个人而言,我发现上面的逻辑更具可读性,但两者产生的输出是相同的。

代码语言:javascript
运行
复制
For Each c As Customer In MyCustomers
    Xdoc.Root.Add(
        <Customer ID=<%= c.Id %>>
            <FirstName><%= c.Name %></FirstName>
            <%= From sn In New String() { c.Surname }
                Where sn IsNot Nothing
                Select <Surname><%= sn %></Surname>
            %>
        </Customer>
    )
Next

这是输出:

代码语言:javascript
运行
复制
<Customers>
  <Customer ID="1">
    <FirstName>Cust1</FirstName>
    <Surname>Surn1</Surname>
  </Customer>
  <Customer ID="2">
    <FirstName>Cust2</FirstName>
  </Customer>
  <Customer ID="3">
    <FirstName>Cust3</FirstName>
    <Surname>Surn3</Surname>
  </Customer>
  <Customer ID="4">
    <FirstName>Cust4</FirstName>
  </Customer>
</Customers>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24064606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档