xml
  • perl
  • xpath
  • 2009-12-09 2 views 0 likes 
    0

    XML 트리에서 속성을 가져 오려고합니다. 그러므로 libxml-xpath-perl 패키지에서 xpath 명령을 사용합니다. Linux 명령에서 값 선택 xpath (Perl)

    file="/var/lib/libvirt/images/save.raw" 
    

    가 어떻게 만 값을 선택할 수 있습니다이 나에게주는

    virsh dumpxml save | xpath -e "/domain/devices/disk[@type='file']/source/@file[1]" 
    

    :이 명령을 알아 냈어? (/var/lib/libvirt/images/save.raw)

    감사

    팔스타프

    답변

    2

    내가 사용하는 (내가 쓴 때문에 어쩌면 -) xml_grep2, 결과의 텍스트 값 반환 편리한 -t 옵션이 App::xml_grep2에서 :

    virsh dumpxml save | xml_grep2 -t "/domain/devices/disk[@type='file']/source/@file[1]" 
    
    을 >

    는 litterally 컷 -d = -f (2)를 사용하여 분할,

    0

    당신은 split (perldoc -f split을)를 =에 따라 문자열을 분리, 그래서 사용하려면 :

    my ($attr, $value) = split /=/, 'file="/var/lib/libvirt/images/save.raw"'; 
    

    그러나 이러한 값을 그대로 구문 분석하는 대신 XML::XPath과 같이 XML 파서의 라이브러리를 많이 사용해야합니다.

    +0

    그것의 내 bashscript 지금 사용하는 해결 방법을 작동해야하지만 난 $ virsh를 2 저장 dumpxml, 그것의 XPath는 기능을 사용 뭔가를 원하는/dev/n ull | xpath -e "값 (/ domain/devices/disk [@ type = 'file']/source/@ file [1])" ... – falstaff

    0
    /domain/devices/disk[@type='file']/source/@file[1]/text() 
    
    +0

    이렇게하면 다음과 같습니다. $ virsh dumpxml save 2>/dev/null | stdin에서 노드를 찾을 수 없습니다. – falstaff

    +0

    흠, 분명히 알몸의 텍스트 노드는 처리/표시 할 수 없습니다. 내 부분에 대해서는 추측이었습니다. – Tomalak

    0

    나는 값을 반환하는 것이 정상적인 동작이라고 생각합니다. 어쩌면 그것은 버그일까요? 나는 /text()을 Tomalak이 제안한 것과 비슷하게 시도했지만 아무것도 반환하지 않았다.
    당신 수 이제 파이프 원하는 결과를 얻을 수 sed 같은 다른 명령의 출력 :

    ... | sed -r 's/.*?"(.*)"/\1/' 
    

    편집 : 분명히 펄 스크립트가 XML::XPath을 사용하고 노드 집합 개체를 반환하는 쿼리 만 find를 사용
    . 그러나 스크립트가 사용하지 않는 findvalue도 있습니다. 어쩌면 당신은 대본을 가지고 조금 주위를 돌릴 수 있습니다. findfindvalue으로 바꾸는 것만으로 stdout의 값만 제공하고 stderr의 오류 메시지도 표시합니다. 라이브러리에 대한
    문서 : https://metacpan.org/pod/XML::XPath

    +0

    그래, 내가 지금 사용하는 것처럼 ... xpath 방식으로하고 싶다 ... cut -d = -f 2 – falstaff

    관련 문제