我遇到过一种情况,我需要从 xml 中提取值,但是标签丢失了。为了详细说明,我手动计数了大约 5 个相同元素,但是,一个兄弟节点(哥哥)没有与其他哥哥相同的元素。举例来说,请参阅下面的 xml:(我以前使用过这个,但我会尝试使用它作为示例)
<?xml version="1.0"?>
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts"
DTS:refId="Package"
DTS:CreationDate="7/22/2019 4:18:27 PM"
DTS:CreationName="Microsoft.Package"
DTS:CreatorComputerName="ADMIN-8DF005D47"
DTS:CreatorName="ADMIN-8DF005D47\Administrator"
DTS:DTSID="{8CCA1D42-642A-4932-AAEC-E02175A4B2DB}"
DTS:ExecutableType="Microsoft.Package"
DTS:LastModifiedProductVersion="15.0.2000.68"
DTS:LocaleID="1033"
DTS:ObjectName="HardestNestedWorkflow2"
DTS:PackageType="5"
DTS:VersionBuild="12"
DTS:VersionGUID="{FDD9B190-1A03-4A19-8794-FA86F4F46A93}">
<DTS:Property
DTS:Name="PackageFormatVersion">8</DTS:Property>
<DTS:ConnectionManagers>
<DTS:ConnectionManager
DTS:refId="Package.ConnectionManagers[ADMIN-8DF005D47.AdventureWorks]"
DTS:CreationName="OLEDB"
DTS:DTSID="{A32A68DF-3D53-4057-AF80-1B8D524F82BC}"
DTS:ObjectName="ADMIN-8DF005D47.AdventureWorks">
<DTS:ObjectData>
<DTS:ConnectionManager
DTS:ConnectionString="Data Source=ADMIN-8DF005D47;Initial Catalog=AdventureWorks;Provider=SQLNCLI11;Integrated Security=SSPI;Application Name=SSIS-HardestNestedWorkflow2-{A32A68DF-3D53-4057-AF80-1B8D524F82BC}ADMIN-8DF005D47.AdventureWorks;Auto Translate=False;" />
</DTS:ObjectData>
<!--snipped-->
</DTS:ConnectionManager>
</DTS:ConnectionManagers>
</DTS:Executable>
所以有(大哥)那里会有兄弟姐妹(我正在寻找这些元素)。
xmllint
现在,当我使用with提取它们时xpath
,只有那些存在的兄弟姐妹才会被提取。
xml 代码可能是一个不好的例子,但这是我想要实现的格式。左边一列是大兄弟节点,右边一列是兄弟节点
DTS:CreationName="OLEDB" {A32A68DF-3D53-4057-AF80-1B8D524F82BC}
DTS:CreationName="Excel" {A32A68DF-3D53-4057-AF80-1B8D524F82BC}
DTS:CreationName="..." <no value>
DTS:CreationName="blah blah" <no value>
有没有办法将xmllint
xpath
代码写入
- 创建与上面相同的格式?就像数据库结果集一样。
awk
在兄弟节点和兄弟节点之间添加一个额外的字符,这样我就可以使用ie来拾取它DTS:CreationName="OLEDB"%{A32A68DF-3D53-4057-AF80-1B8D524F82BC}
- 不要显示空白,只需输入
NULL
或任何会提醒我兄弟姐妹不存在的字符 如果有超过 1 个兄弟节点,则将相同的兄弟节点并排放置。
哥哥1%兄弟姐妹1
哥哥1%兄弟姐妹2
这确实有帮助。期待学习更多的xmllint
!