【问题标题】:Add child note above node在节点上方添加子注释
【发布时间】:2019-12-19 20:41:21
【问题描述】:

我正在尝试从 SQL 转换为 XML,但是必须正确格式化它,否则它将无法工作。我正在使用 C# 在 QBXML 之间插入我的 sql

select employee_name as Name ,'OCI Associates' as [CompanyName],'Mr' as Salutation ,
 LEFT(employee_name,CHARINDEX(' ',employee_name + ' ')-1) as FirstName,  REVERSE(LEFT(REVERSE(employee_name),
CHARINDEX(' ',REVERSE(employee_name))- 1)) AS LastName


  from EMPLOYEELIST 
for xml raw('CustomerAdd') , ROOT('CustomerAddRq'), ELEMENTS

这就是我得到的

<CustomerAdd>
        <Name>Zohreh FAKELASTNAME</Name>
        <Salutation>Mr</Salutation>
        <FirstName>Zohreh</FirstName>
        <LastName>FAKELASTNAME</LastName>
      </CustomerAdd>
      <CustomerAdd>
        <Name>Phillip FAKELASTNAME</Name>
        <Salutation>Mr</Salutation>
        <FirstName>Phillip</FirstName>
        <LastName>FAKELASTNAME</LastName>
      </CustomerAdd>

这就是我需要的

'''

 <CustomerAddRq>
<CustomerAdd>
        <Name>Zohreh FAKELASTNAME</Name>
        <Salutation>Mr</Salutation>
        <FirstName>Zohreh</FirstName>
        <LastName>FAKELASTNAME</LastName>
      </CustomerAdd>
 </CustomerAddRq>
 <CustomerAddRq>
  <CustomerAdd>
    <Name>Phillip FAKELASTNAME</Name>
    <Salutation>Mr</Salutation>
    <FirstName>Phillip</FirstName>
    <LastName>FAKELASTNAME</LastName>
  </CustomerAdd>

'''

我不确定如何在每个“CustomerAdd”上添加“CustomerAddRq”

【问题讨论】:

    标签: c# sql xml


    【解决方案1】:

    试试 xml linq。我取了一个字符串数组,其中包含我假设来自数据库的元素,然后添加到你的根节点。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] xmlArray = {
                                        "<CustomerAdd>" +
                                          "<Name>Zohreh FAKELASTNAME</Name>" +
                                          "<Salutation>Mr</Salutation>" +
                                          "<FirstName>Zohreh</FirstName>" +
                                          "<LastName>FAKELASTNAME</LastName>" +
                                        "</CustomerAdd>",
                                        "<CustomerAdd>" +
                                          "<Name>Phillip FAKELASTNAME</Name>" +
                                          "<Salutation>Mr</Salutation>" +
                                          "<FirstName>Phillip</FirstName>" +
                                          "<LastName>FAKELASTNAME</LastName>" +
                                        "</CustomerAdd>"
                                    };
                XElement customerAddRq = new XElement("CustomerAddRq");
                customerAddRq.Add(xmlArray.Select(x => XElement.Parse(x)));
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      请 - 对于您的下一个问题 - 始终使用您的实际 RDBMS(供应商和版本)进行标记。你标记了[sql],这还不够……

      根据您的代码,我假设这是 SQL Server。

      你可以试试这个:

      创建一个模型表来模拟你的问题(下次请自己做)

      DECLARE @fakeTable TABLE(employee_name VARCHAR(100), salutation VARCHAR(50));
      INSERT INTO @fakeTable VALUES
       ('Zohreh FAKELASTNAME','Mr')
      ,('One MORE','Ms')
      

      --自己的查询,略有改动

      select employee_name as [CustomerAdd/Name] 
            ,'OCI Associates' as [CustomerAdd/CompanyName]
            , salutation as [CustomerAdd/Salutation]
            , LEFT(employee_name,CHARINDEX(' ',employee_name + ' ')-1) as [CustomerAdd/FirstName]
            ,  REVERSE(LEFT(REVERSE(employee_name),CHARINDEX(' ',REVERSE(employee_name))- 1)) AS [CustomerAdd/LastName]
      from @fakeTable EMPLOYEELIST 
      for xml PATH('CustomerAddRq');
      

      简而言之:

      我使用PATH-mode。这允许在列的别名中使用 XPath 表达式。
      ROOT 将是最外层的元素,只出现一次。 PATH('ThisName') 之后的名称将出现在任意行周围。
      魔法来了:

      • 引擎打开行的标签并找到一个元素为[CustomerAdd/Name]
      • 它将写入开始标签&lt;CustomerAdd&gt;,然后写入开始标签&lt;Name&gt;
      • 在这个元素中,它会将内容写入text() 节点。
      • 现在引擎找到&lt;CustomerAdd/CompanyName&gt;
      • 引擎将关闭 &lt;Name&gt;,但 - 仍在 &lt;CustomerAdd&gt; 内 - 将在此处继续并打开 &lt;CompanyName&gt;
      • ...等等...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多