xml을 쉘 스크립트의 매개변수로 구문 분석하는 방법

xml을 쉘 스크립트의 매개변수로 구문 분석하는 방법

이것은 내 샘플 XML 파일입니다. max_size를 출력으로 가져와야 합니까?

xlimit와 xpath를 사용해 보았지만 둘 다 작동하지 않았습니다.

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
   <service_info name="dummyapp" version="5.0"
   <object name="WebApplications">
      <item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
   </object>
   <object name="jdbc_oracle_nonxa">
      <item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
</object>

답변1

XML이 잘 구성되어 있다고 가정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
  <service_info name="dummyapp" version="5.0"/>
  <object name="WebApplications">
    <item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
  </object>
  <object name="jdbc_oracle_nonxa">
    <item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
  </object>
</weblogic-service>

(질문에 닫히지 않은 태그는 닫았습니다)

...이 경우 다음이 출력됩니다 25(이 예의 경우).

xml sel -t -v '//item/@max_size' -nl file.xml

이것은 사용 중입니다XML 스타max_value모든 노드의 속성값을 가져옵니다 item. 마지막으로 -nl출력 뒤에 개행 문자를 삽입하십시오.

item좀 더 구체적으로 설명하고 노드 내의 노드만 살펴봐야 한다면 다음과 같습니다.objectnamejdbc_oracle_nonxa

xml sel -t -v '//object[@name="jdbc_oracle_nonxa"]/item/@max_size' -nl file.xml

XMLStarlet은 xmlstarlet설치된 것이 아니라 xml일부 시스템에 설치된다는 점에 유의하십시오.


사용 xmllint(출력 끝에 개행 없이):

xmllint --xpath 'string(//object[@name="jdbc_oracle_nonxa"]/item/@max_size)' file.xml

답변2

일반적으로 sed 또는 grep을 사용하는 것이 더 빠르지만 덜 안전합니다.

sed -E -n 's/.*max_size="([0-9]+)".*/\1/p' sample-4.xml 
25

또는 grep:

grep -Eo 'max_size="[0-9]+" ' sample-4.xml | grep -Eo "[0-9]+"
25

XML의 유효성을 검사하지 않으며 인식 없이 주석 처리된 코드를 선택할 수 있습니다. 화면을 보고 두 가지 결과를 얻으면 눈치챌 수도 있지만, 자동화된 프로세스에서 이를 사용하면 실수하기 쉽습니다.

때로는 XML을 생성하는 프로그램을 작성하여 다른 원치 않는 컨텍스트에서 주석 또는 max_size="..."를 출력하는지 알 수 있습니다. 이러한 제한 사항을 알고 있다면 sed, grep 또는 awk에 아무런 문제가 없습니다. 단지 아름다운 xmlstarlet 구문을 배우지 못하게 한다는 것뿐입니다. :)

관련 정보