xmllintの使い方 - xml属性を取得するのは難しいです。

xmllintの使い方 - xml属性を取得するのは難しいです。

実際には、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;

関連情報