c# - 如何将 XML 字符串替换为另一个 XML 字符串
问题描述
<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 转换为以下预期输出:
<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>
我已经检查了 SQL 中的替换函数,但是 XML 中的“类型”之类的元素存在于不同的 xml 父标签中。
我试图获取所有属性,它的值也使用下面的几个 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 是你的朋友。(:
因此,如果@Input
是包含您的第一个 Xml 数据的变量,您可以运行以下语句,并在您的 Xml 变量上Select
应用 XPath :query
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 构造,并学习运算符/函数)。
推荐阅读
- python - 为什么字典值比较在 python 中不起作用
- autocomplete - Omnisharp + Neovim 不检测缓冲区中未加载的 csharp 文件
- r - 合并功能重复所有行
- python - 如何使用 Selenium 找到并单击 data-qa 按钮?
- c# - 我的对象数组中的内部对象未正确分组
- python - 如何使用 torchtext v0.9 实现自定义数据集?
- flutter - 在 Flutter 应用程序的 Obx() 侦听器中调用 Get.back()
- python - pandas - 为什么 iloc 和 loc 的输出不同
- vb.net - 在 MS Access 中保存来自 VB.Net Windows 窗体的数据时出现错误 System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配”。
- javascript - 为什么基数排序的大 O 不是二次的?