繁体   English   中英

如何将 XML 字符串替换为另一个 XML 字符串

[英]How to replace XML string into another XML string

<recurrence>
  <interval>1</interval>
  <unit>O</unit>
  <firsttime>2021-02-12T17:42:00</firsttime>
  <lasttime>1900-01-01T12:00:00</lasttime>
</recurrence>
<output>
  <outputformat>TXT</outputformat>
  <delimiter>,</delimiter>
  <filename>testfile1</filename>
  <path>\\AIR-LAP-700053\TestGEMOutput</path>
  <appendtofile />
  <content>
    <type>NORMAL</type>
    <storedprocedure />
    <outputitems>
      <outputitem>
        <field>
          <tablename>VW_DOCUMENT</tablename>
          <fieldname>GUID</fieldname>
        </field>
        <format>
          <type>CHAR</type>
          <specification />
        </format>
      </outputitem>
      <outputitem>
        <field>
          <tablename>VW_DOCUMENT</tablename>
          <fieldname>PHYSICAL_DOC_GUID</fieldname>
        </field>
        <format>
          <type>CHAR</type>
          <specification />
        </format>
      </outputitem>
      <outputitem>
        <field>
          <tablename>VW_DOCUMENT</tablename>
          <fieldname>DOC_TYPE</fieldname>
        </field>
        <format>
          <type>CHAR</type>
          <specification />
        </format>
      </outputitem>
    </outputitems>
    <criteria>
      <criterion>
        <field>
          <tablename>VW_DOCUMENT</tablename>
          <fieldname>DOC_TYPE</fieldname>
        </field>
        <restriction>
          <type>=</type>
          <data>Default</data>
          <functioncode />
        </restriction>
      </criterion>
    </criteria>
  </content>
</output>

我想将上面的 XML 转换为以下预期的 output:

<ExportJobDefinition xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Recurrence>
    <Interval>1</Interval>
    <Unit>W</Unit>
    <FirstTime>2021-02-19T12:36:00Z</FirstTime>
    <LastTime>2021-02-24T12:36:00Z</LastTime>
  </Recurrence>
  <Output>
    <OutputFormat>TXT</OutputFormat>
    <Delimiter>/</Delimiter>
    <FileName>ColdIndexLog</FileName>
    <Path>\\MUM-LAP-1092\3PrtyUpgImages\Images\Data\cold\Logs</Path>
    <OverwriteFile>O</OverwriteFile>
    <Content>
      <ContentType>NORMAL</ContentType>
      <OutputItems>
        <ExportJobOutputItem>
          <Field>
            <TableName>Document</TableName>
            <FieldName>Document / Doc_Ref</FieldName>
          </Field>
          <Format>
            <Specification />
          </Format>
        </ExportJobOutputItem>
        <ExportJobOutputItem>
          <Field>
            <TableName>Document</TableName>
            <FieldName>Document / Doc_Type</FieldName>
          </Field>
          <Format>
            <Specification />
          </Format>
        </ExportJobOutputItem>
      </OutputItems>
      <Criteria>
        <ExportJobCriterion>
          <Field>
            <TableName>Document </TableName>
            <FieldName>Document / Doc_Type</FieldName>
          </Field>
          <Restriction>
            <RestrictionType>Less than</RestrictionType>
            <Data>ABC</Data>
          </Restriction>
        </ExportJobCriterion>
      </Criteria>
    </Content>
  </Output>
</ExportJobDefinition>

I have check with replace function in SQL but element like "Type" inside XML is exist in different xml parent tags.

我试图获取所有属性,它的值也使用下面的几个 XmlQueries 但没有任何结果:

--DECLARE @temp table (TableName VARCHAR(MAX), FieldName varchar(max))
--INSERT INTO @temp
SELECT tablename = Node.Data.value('(tablename)[1]', 'VARCHAR(MAX)'),
       fieldname = Node.Data.value('(fieldname)[1]', 'VARCHAR(MAX)')
FROM    @xmlData.nodes('/output/content/outputitems/outputitem/field') Node(Data)

--select * from @temp

--select * from @temp FOR XML PATH('')

--DECLARE @temp1 table (Type VARCHAR(MAX), Specification varchar(max))
--INSERT INTO @temp1
SELECT [type] = Node.Data.value('(type)[1]', 'VARCHAR(MAX)'),
       specification = Node.Data.value('(specification)[1]', 'VARCHAR(MAX)')
FROM    @xmlData.nodes('/output/content/outputitems/outputitem/format') Node(Data)

--select * from @temp1

--select * from @temp FOR XML PATH('')


--WITH R AS (
--SELECT
--    ElementName = T.x.value('local-name(.)', 'nvarchar(255)'),
--    ElementValue = T.x.value('text()[1]', 'nvarchar(255)'),

--    AttrName = R.x.value('local-name(.)', 'nvarchar(255)'),
--    AttrValue = R.x.value('(.)[1]', 'nvarchar(255)')
--FROM
--    @xmlData.nodes('//*') AS T(x)
--    OUTER APPLY
--    T.x.nodes('@*') AS R(x)
--)
--SELECT
--  CASE WHEN ElementValue IS NULL THEN AttrName ELSE ElementName END AS [Name],
--    COALESCE(ElementValue, AttrValue) AS [Value]
--FROM
--  R
--WHERE
--  ElementValue IS NOT NULL
--  OR AttrValue IS NOT NULL
--GO

                         

请记住这两点: 1. Microsoft SQL Server 是一个非常强大的工具,不仅因为 T-SQL,还因为它集成的工具。 2. XQuery & XPath 是你的朋友。 (:

So if @Input is a variable containing your first Xml data, you can run the following Select statement, and apply an XPath query on your Xml variable:

Declare @Input Xml = '<recurrence>
  <interval>1</interval>
  <unit>O</unit>......
.......
</recurrence>'

Select  @Input.query('
<ExportJobDefinition xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Recurrence>
    <Interval>{ data(/recurrence/interval[1]) }</Interval>
    <Unit>{ data(/recurrence/unit[1]) }</Unit>
    <FirstTime>{ data(/recurrence/firsttime[1]) }</FirstTime>
  </Recurrence>
  <Output>
    <OutputFormat>TXT</OutputFormat>
    <Delimiter>/</Delimiter>
    <FileName>ColdIndexLog</FileName>
    <Path>\\MUM-LAP-1092\3PrtyUpgImages\Images\Data\cold\Logs</Path>
    <OverwriteFile>O</OverwriteFile>
    <Content>
      <ContentType>NORMAL</ContentType>
      <OutputItems>
    {
        for $i in /output[1]/content[1]/outputitems[1]/outputitem
          return <ExportJobOutputItem>
              <Field>
                <TableName>{ data($i/field[1]/tablename) }</TableName>
                <FieldName>{ data($i/field[1]/fieldname) }</FieldName>
              </Field>
              <Format>
                <Specification />
              </Format>
              </ExportJobOutputItem>
    }
      </OutputItems>
    </Content>
  </Output>
</ExportJobDefinition>
')

结果将是一个标量 Xml 值:

    <ExportJobDefinition xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Recurrence>
    <Interval>1</Interval>
    <Unit>O</Unit>
    <FirstTime>2021-02-12T17:42:00</FirstTime>
  </Recurrence>
  <Output>
    <OutputFormat>TXT</OutputFormat>
    <Delimiter>/</Delimiter>
    <FileName>ColdIndexLog</FileName>
    <Path>\\MUM-LAP-1092\3PrtyUpgImages\Images\Data\cold\Logs</Path>
    <OverwriteFile>O</OverwriteFile>
    <Content>
      <ContentType>NORMAL</ContentType>
      <OutputItems>
        <ExportJobOutputItem>
          <Field>
            <TableName>VW_DOCUMENT</TableName>
            <FieldName>GUID</FieldName>
          </Field>
          <Format>
            <Specification />
          </Format>
        </ExportJobOutputItem>
        <ExportJobOutputItem>
          <Field>
            <TableName>VW_DOCUMENT</TableName>
            <FieldName>PHYSICAL_DOC_GUID</FieldName>
          </Field>
          <Format>
            <Specification />
          </Format>
        </ExportJobOutputItem>
        <ExportJobOutputItem>
          <Field>
            <TableName>VW_DOCUMENT</TableName>
            <FieldName>DOC_TYPE</FieldName>
          </Field>
          <Format>
            <Specification />
          </Format>
        </ExportJobOutputItem>
      </OutputItems>
    </Content>
  </Output>
</ExportJobDefinition>

您可以在 Microsoft 网站上阅读有关 XQuery 的所有信息(特别是查找 Xml 构造,并了解运算符/函数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM