実際には、SSISパッケージファイル(dtsx)であるxmlファイルから一部のデータを取得しています。使用について読みましたxmllint
が、欲しいものを検索するのに問題があります。ここにいらっしゃる方に助けを少しお願いしたいと思います。私の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>
価値を探しています」8「この線を越えて
<DTS:Property
DTS:Name="PackageFormatVersion">8</DTS:Property>
だから私がしたことは命令を出すことでした。
xmllint --xpath "//*[local-name()='Executable']/*[local-ame()='Property']/text()" HardestNestedWorkflow2_latest.xml
..これはうまくいきます。 「8」の値を抽出できます。
今、値を抽出したいと思います。
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;
私はこのような発言をしました。
xmllint --xpath "//*[local-name()='Executable']/*[local-name()='ConnectionManagers']/*[local-name()='ConnectionManager']/*[local-name()='ObjectData']/*[local-name()='ConnectionManager']" HardestNestedWorkflow2_latest.xml
これはこれを返します
<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:ConnectionManager DTS:ConnectionString
?申し訳ありません。使い方についてよくわかりませんxmllint
。
事前にありがとう
答え1
要素が見つかりましたが、@DTS:ConnnectionString
要素自体の値ではなく属性の値が必要です。名前空間がない場合はサフィックスを使用して選択する必要があります@ConnectionString
が、ここに名前空間があるので、xmllint
すべての要素名を一致させるのと同じ方法で一致させる必要があります@*[local-name()='ConnectionString']
。また、結果の前半の属性名を削除するには、を使用して後処理する必要がありますstring()
。醜い。
xmllint --xpath "string(//*[local-name()='Executable']/*[local-name()='ConnectionManagers']/*[local-name()='ConnectionManager']/*[local-name()='ObjectData']/*[local-name()='ConnectionManager']/@*[local-name()='ConnectionString'])" file.xml
出力
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;
個人的には、私はxmlstarlet
名前空間のより明確な理解を提供するこのタイプの作業を好みますが、最終的には自分にとって最も便利なツールを使用する方が良いでしょう。
xmlstarlet sel xmlns:DTS="www.microsoft.com/SqlServer/Dts" -t -v '/DTS:Executable/DTS:Property' -n file.xml
8
xmlstarlet sel xmlns:DTS="www.microsoft.com/SqlServer/Dts" -t -v '/DTS:Executable//DTS:ConnectionManager/@DTS:ConnectionString' -n file.xml
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;