대용량 파일 XML을 필터링하고 여러 기준을 사용하여 문자열을 찾아야 합니다. cnisfCF가 true이고 natg_passwordAlreadyResetedPostMigration이 true인 경우 이메일을 필터링해야 합니다.
누구든지 도와줄 수 있나요?
<customer customer-no="09090909090">
<credentials>
<login>[email protected]</login>
<enabled-flag>true</enabled-flag>
<password-question/>
<password-answer/>
</credentials>
<profile>
<salutation/>
<title/>
<first-name>teste</first-name>
<second-name/>
<last-name>name 1</last-name>
<suffix/>
<company-name/>
<job-title/>
<email>[email protected]</email>
<phone-home>542926407485</phone-home>
<phone-business/>
<phone-mobile/>
<fax/>
<birthday>1999-09-12Z</birthday>
<gender>2</gender>
<creation-date>2022-09-19T18:34:45.000Z</creation-date>
<preferred-locale/>
<custom-attributes>
<custom-attribute attribute-id="natg_Newsletter">false</custom-attribute>
<custom-attribute attribute-id="natg_cfIsCn">false</custom-attribute>
<custom-attribute attribute-id="natg_cpf">5465465456456</custom-attribute>
<custom-attribute attribute-id="natg_infContOptIn">false</custom-attribute>
<custom-attribute attribute-id="natg_optInWP">false</custom-attribute>
<custom-attribute attribute-id="natg_passwordAlreadyResetedPostMigration">true</custom-attribute>
<custom-attribute attribute-id="natg_personNumber">116864397</custom-attribute>
<custom-attribute attribute-id="natg_pushOptIn">false</custom-attribute>
<custom-attribute attribute-id="natg_rut">456456456</custom-attribute>
</custom-attributes>
</profile>
답변1
다음 명령을 테스트 실행하기 전에 </customer>
누락된 닫는 태그를 데이터에 자유롭게 추가 했습니다. cnisfCF
이것이 귀하의 경우라고 가정합니다 natg_cfIsCn
(속성 및 노드 이름은 대소문자를 구분합니다).
사용 xmlastarlet
:
xmlstarlet select --template \
--match '//profile' \
--match 'self::node()[custom-attributes/custom-attribute[@attribute-id="natg_cfIsCn"]="true"]' \
--match 'self::node()[custom-attributes/custom-attribute[@attribute-id="natg_passwordAlreadyResetedPostMigration"]="true"]' \
--value-of 'email' -nl file.xml
위 명령은 email
속성 합계가 있는 입력 문서의 모든 노드와 값 합계의 하위 노드에서 노드 값을 추출합니다.profile
custom-attributes/custom-attribute
attribute-id
natg_cfIsCn
natg_passwordAlreadyResetedPostMigration
false
true
여기서 까다로운 점은 경로에 포함된 노드 이름이 너무 길기 때문에 읽기 쉬운 방식으로 명령을 표시한다는 것입니다. 먼저 //profile
경로를 일치시킨 다음 두 가지 개별 단계를 수행하여 결과 집합의 범위를 좁혀 이 문제를 해결했습니다 .
단일 "값" XPath 쿼리만 사용하는 select 문은 다음과 같습니다.
xmlstarlet select --template \
--value-of '//profile[
custom-attributes/custom-attribute[@attribute-id="natg_cfIsCn"]="true" and
custom-attributes/custom-attribute[@attribute-id="natg_passwordAlreadyResetedPostMigration"]="true"
]/email' -nl file.xml
이것이 더 예뻐 보인다면 대신 사용하세요. 나는 그들이 동등해야 한다고 믿습니다.
쿼리와 일치하는 데이터가 없기 때문에 위 명령은 지정된 문서에 대한 출력을 생성하지 않습니다.