Mac OS 터미널을 통해 특정 태그가 없는 .xml 파일 검색

Mac OS 터미널을 통해 특정 태그가 없는 .xml 파일 검색

다음에 대한 제안사항이 있으면 감사하겠습니다.

수천 개의 .xml 파일이 포함된 "ABC"라는 폴더가 있습니다. XML의 핵심 구조는 동일합니다.

<product abcd…>
  <category>
  ...
  </category>
</product>

일부 xml 파일은 다음과 같이 생각할 수 있습니다.효과적인필수 태그가 포함되어 있기 때문에 <category>) 그 중 일부는유효하지 않은필수 <category>태그가 완전히 누락되었기 때문입니다. 닫히지도 않아</category>

따라서 목표는 </category>"ABC" 폴더에 있는 XML에 태그가 없는 "잘못된" xml을 터미널을 통해 찾는 것입니다.

어떤 기회?

답변1

모든 XML 파일의 형식이 올바르다고 가정하고 : 를 사용하면 xmlstarlet다음은 일치하는 모든 파일의 입력 파일 이름을 인쇄합니다.아니요아래 에 직계 하위 category노드가 있습니다 product.

xmlstarlet sel -t --if '/product/category' --else -f -nl ABC/*.xml

category어디에도 노드가 없는 파일 만 검색하려는 경우 :

xmlstarlet sel -t --if '//category' --else -f -nl ABC/*.xml

두 명령 모두에서 xmlstarlet지정된 XPath 표현식이 평가됩니다. 표현식이 발견된 하나 이상의 노드 집합으로 평가되는 경우 --if테스트는 다음과 같습니다.진짜다른 일은 일어나지 않습니다. 그렇지 않으면 --else분기가 평가되어 -f -nl현재 파일 이름이 후행 줄 바꿈과 함께 출력됩니다.

노드가 누락된 파일에 대해 일부 작업을 수행한다고 가정하면 category다음은 관련 파일을 처리할 수 있는 루프를 설정합니다.

for xml in ABC/*.xml; do
    if ! xmlstarlet sel -t --if '/product/category' -nl "$xml" >/dev/null
    then
        # process "$xml" here
    fi
done

macOS에서의 설치는 xmlstarletHomebrew를 통해 수행하는 것이 가장 좋습니다. Homebrew 패키지를 호출 xmlstarlet하면 xml.xmlstarlet

답변2

다음과 같은 작업이 수행됩니다.

grep -vl '</category>' ABC/*

열린 태그가 없는 파일도 보려면 다음을 시도해 보세요.

grep -vl 'category>' ABC/*

관련 정보