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;

관련 정보