첫 번째 속성이 일치하면 xmllint는 두 번째 속성의 값을 표시합니다.

첫 번째 속성이 일치하면 xmllint는 두 번째 속성의 값을 표시합니다.

내 XML은 다음과 같습니다

<list1>
   <list2 id="abc" value="yes"></list2>
   <list2 id="xyz" value="no"></list2>
   <list2 id="def" value="yes"></list2>
<list1>

사용xmllint하지만 올바른 출력을 얻을 수 없습니다. "abc"를 제공하는 위의 xml을 쿼리하면 "yes"를 반환해야 합니다.

답변1

XPath string()함수를 사용하여 속성 값만 가져올 수 있습니다 value.

$ xmllint --xpath 'string(//list1/list2[@id="abc"]/@value)' data.xml
yes

일반적인 구문을 사용하여 변수로 캡처할 수 있습니다 bash.

value=$(
  xmllint --xpath \
  'string(//list1/list2[@id="abc"]/@value)' data.xml
)

그런 다음:

echo $value

결과 :

yes

답변2

  1. 형식 xml이 잘못되었습니다. label list1의 데이터가 일찍 종료되었습니다. </list1>마지막에 있어야합니다 .
  2. @eyoung100이 제안한 대로 xmllint.
  3. echo 'cat //list1/list2[@id="abc"]/@value' | xmllint --shell myxml | awk -F'[="]' '!/>/{print $(NF-1)}'xml1번 항목에서 언급한 내용을 수정하고 파일이 현재 작업 디렉터리에 있는지 확인하거나 절대 경로를 사용하면 제대로 작동 myxml하지만 이는 올바른 접근 방식은 아닙니다.

암호:

myvar='abc'
myxml='myxml'
myvalue="cat //list1/list2[@id=\"'$myvar'\"]/@value | xmllint --shell $myxml"
sh -c "echo $myvalue | gawk -F'[=\"]' '!/>/{print \$(NF-1)}'"

이게 당신이 하고 싶은 일인가요?

관련 정보