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