xmllint는 단일 실행에서 둘 이상의 속성 값을 표시합니다.

xmllint는 단일 실행에서 둘 이상의 속성 값을 표시합니다.

저는 xmllint를 사용하여 각각 여러 속성을 가진 여러 태그가 있는 xml 파일을 구문 분석하고 있습니다. 예제 구조는 다음과 같습니다.

<root>
   <child attr1="abc" attr2="def" attr3="ghi" />
   ...
   ...
</root>

attr1attr2속성에서 값을 얻어야 하고 , attr3.

지금까지 나는 속성 데이터를 완벽하게 제공하는 다음을 시도했습니다.

echo 'cat //root/child/@attr1' | xmllint --shell data.xml 

이 출력

attr1="abc"

그래서 내 질문은 원하는 출력을 얻기 위해 문자열에 여러 속성을 어떻게 지정할 수 있는지입니다.

attr1="abc"
attr2="def"
attr3="ghi"

나는 좋은 결과 없이 다음을 시도했습니다.

echo 'cat //root/child/@*[attr1|attr2|attr3]' | xmllint --shell data.xml 
echo 'cat //root/child/@*[attr1 or attr2 or attr3]' | xmllint --shell data.xml 

위의 출력은 다시 에코되는 echo 문입니다. 이는 xmllint가 이를 입력으로 받아들이지 않음을 의미합니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변1

내가 아는 한 |구분 기호는 전체 경로에서만 사용할 수 있습니다.

echo 'cat /root/child/@attr1|/root/child/@attr2|/root/child/@attr3' | xmllint --shell data.xml

( //의미의 깊이에 관계없이 "//루트"는 파서가 무의미한 추가 작업을 수행하게 만듭니다. 예제 XML이 실제 XML과 유사한 구조를 가지고 있다고 가정하면(따라서 루트는 실제로 XML의 루트 노드입니다) "/root/child"를 사용하는 것이 가장 좋습니다.)

또는 XPath 함수와 함께 표현식을 사용할 수 있습니다.

echo 'cat /root/child/@*[name()="attr1" or name()="attr2" or name()="attr3"]' | xmllint --shell data.xml

"attr*" 이름을 가진 모든 속성이 필요한 경우 일반 표현식을 사용할 수 있습니다.

echo 'cat /root/child/@*[starts-with(name(),"attr")]' | xmllint --shell data.xml

답변2

grep -o attr[0-9]...... file.ext

빠르고 더러운…

관련 정보