如何在节点集之前和之后添加 XML 节点

本文关键字:节点 之后 添加 XML 点集 | 更新日期: 2023-09-27 18:31:36

我正在寻找一种方法,将这个节点"LoanSecondaryStatusDates"添加到开头,并将其相应的结束标签"LoanSecondaryStatusDates"添加到末尾。我在SQL服务器中使用"FOR XML"生成了以下内容,但无法弄清楚如何添加开始和结束标记。 如果这可以使用"FOR XML",那么示例会很棒,其他C#就可以了。谢谢!

现在:

<Loans>
    <Loan>
      <GUID></GUID>
      <AgentCompanyName></AgentCompanyName>
        <LoanSecondaryStatus>
            <StatusName>Name</StatusName>
            <StatusDate>Date</StatusDate>
        </LoanSecondaryStatus>
        <LoanSecondaryStatus>
            <StatusName>Name</StatusName>
            <StatusDate>Date</StatusDate>
        </LoanSecondaryStatus>
    </Loan>
</Loans>

最终结果应该是:

 <Loans>
   <Loan>
   <GUID></GUID>
   <AgentCompanyName></AgentCompanyName>
    <LoanSecondaryStatusDates>
        <LoanSecondaryStatus>
            <StatusName>Name</StatusName>
            <StatusDate>Date</StatusDate>
    </LoanSecondaryStatus>
        <LoanSecondaryStatus>
            <StatusName>Name</StatusName>
            <StatusDate>Date</StatusDate>
        </LoanSecondaryStatus>
    </LoanSecondaryStatusDates>
</Loan>
</Loans>

对于 XML 查询

SELECT 
   [GUID] 
  ,[AgentCompanyName],
   (
   SELECT 
    'Borrower Docs Sent/Req' as 'StatusName',
    CASE WHEN t.BorrowerDocsSent IS NOT NULL THEN t.BorrowerDocsSent ELSE '' END as 'StatusDate'
FROM Encompass_loanData as t
WHERE t.[GUID] = E.[GUID]
FOR XML PATH('LoanSecondaryStatus'), TYPE
  ),
  (
   SELECT 
    t.BorrowerCity as 'StatusName',
    t.[GUID] as 'StatusDate'
FROM Encompass_loanData as t
WHERE t.[GUID] = E.[GUID]
FOR XML PATH('LoanSecondaryStatus'), TYPE
  )
From Encompass_loanData E
FOR XML PATH ('Loan'), type, root('Loans')

SQL 小提琴:http://sqlfiddle.com/#!6/d672a/2/0

如何在节点集之前和之后添加 XML 节点

已发布的 xml 没有有效的根目录。所以我添加了<xml>作为根。

这也可以在 C# 中轻松完成。但这是一种使用 xpath 的方法。

  <xml>
  <LoanSecondaryStatus>
    <StatusName>Name</StatusName>
    <StatusDate>Date</StatusDate>
  </LoanSecondaryStatus>
  <LoanSecondaryStatus>
    <StatusName>Name</StatusName>
    <StatusDate>Date</StatusDate>
  </LoanSecondaryStatus>
  </xml>

下面是 XSL。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <LoanSecondaryStatusDates>     
      <xsl:for-each select="xml/LoanSecondaryStatus">
        <LoanSecondaryStatus>
          <StatusName>
            <xsl:value-of select="StatusName"/>
          </StatusName>
          <StatusDate>
            <xsl:value-of select="StatusDate"/>
          </StatusDate>
        </LoanSecondaryStatus>
      </xsl:for-each>      
    </LoanSecondaryStatusDates>
  </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="utf-8"?>
<LoanSecondaryStatusDates>
  <LoanSecondaryStatus>
    <StatusName>Name</StatusName>
    <StatusDate>Date</StatusDate>
  </LoanSecondaryStatus>
  <LoanSecondaryStatus>
    <StatusName>Name</StatusName>
    <StatusDate>Date</StatusDate>
  </LoanSecondaryStatus>
</LoanSecondaryStatusDates>

使用 SQL 查询进行更新

SELECT 
   [GUID] 
  ,[AgentCompanyName],
   (
   SELECT NULL,   
            (
                SELECT 
                        'Borrower Docs Sent/Req' as 'StatusName',
                        CASE WHEN t.BorrowerDocsSent IS NOT NULL THEN t.BorrowerDocsSent ELSE '' END as 'StatusDate'
                FROM Encompass_loanData as t
                WHERE t.[GUID] = E.[GUID]
                FOR XML PATH('LoanSecondaryStatus'), TYPE
            ),
            (   
                SELECT NULL AS X
                FOR XML PATH('LoanSecondaryStatusDates'), TYPE
            ),
            (
                SELECT 
                        t.BorrowerCity as 'StatusName',
                        t.[GUID] as 'StatusDate'
                FROM Encompass_loanData as t
                WHERE t.[GUID] = E.[GUID]
                FOR XML PATH('LoanSecondaryStatus'), TYPE
            ),
            NULL
    FOR XML PATH('LoanSecondaryStatusDates'),TYPE
    )
    FROM Encompass_loanData E
    WHERE [LASTMODIFIED] >= '20160121'
    FOR XML PATH ('Loan'), type, root('Loans')

看看XElement类,你可以很容易地修改xml树。

https://msdn.microsoft.com/en-us/library/system.xml.linq.xelement(v=vs.110).aspx

http://www.dotnetperls.com/xelement

我能够用这个 XSL 包装子元素

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Loan">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[not(self::LoanSecondaryStatus)]"/>
            <LoanSecondaryStatusDates>
                <xsl:apply-templates select="LoanSecondaryStatus"/>
            </LoanSecondaryStatusDates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>