저는 xmllint를 사용하여 각각 여러 속성을 가진 여러 태그가 있는 xml 파일을 구문 분석하고 있습니다. 예제 구조는 다음과 같습니다.
<root>
<child attr1="abc" attr2="def" attr3="ghi" />
...
...
</root>
attr1
attr2
속성에서 값을 얻어야 하고 , 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
빠르고 더러운…