2017-12-30 58 views
0

XML 파일에 추가 및 삭제 태그가 있습니다. 새 및 휴먼을 제외하고 많은 카테고리가 포함되어 있습니다. XML 파일 아래에는 다른 카테고리 및 많은 값을 가진 많은 항목이 있습니다. 아래다른 xml 태그의 항목 수를 계산하지 않습니다.

<xml version=1.0> 
    <NameCategory="Birds"> 
     <Added> 
     <value name="Duck" count="1"></value> 
     <value name="Dove" count="2"></value> 
     </Added> 
     <Deleted> 
     <value name="crow" count="1"></value> 
     <value name="crane" count="10"></value> 
     </Deleted> 
    </NameCategory> 
    <NameCategory="Humans"> 
     <value name="john" count="1"></value> 
    </NameCategory> 
</xml> 

그래서 여기에 총 개수를 계산해야합니다. 같은 태그의 각 범주에 대한 항목의 xmlstarlet와

Total No Of Added Birds=2 
Total No Of Deleted Birds=2 
Total No Of Added Humans=1 
+6

이 당신의 XML이 잘 형성되지 않는다. 왜 텍스트 기반 솔루션이 특수화 된 xml 기반 도구보다 낫다고 생각합니까? – karakfa

+1

예. 헤더가 분명히 깨졌고 루트 요소가 부족하다는 것이 문제 였지만 ''와 첫눈에 작은 따옴표를 잘못 사용했다는 사실을 놓쳤습니다.이 * really *는 XML 인식 도구를 통해 먹을 수 있으며 그렇지 않으면 가능한 많은 답변을 차단합니다. @missi, 아마도 "XML과 같은"문법 (실제 문서가 실제로 XML이 아닌 경우)을 지정하기 위해이를 편집하거나, 실제로 구문 분석하도록 편집 할 수 있습니까? –

+1

파일이 여전히 유효한 XML이 아닙니다. 파일을 붙여 넣기하여 구문을 확인하십시오. https://validator.w3.org/#validate-by-input – Cyrus

답변

2

이 고정 된 XML 파일로 :

<?xml version="1.0"?> 
<root> 
    <fixed NameCategory="Birds"> 
    <Added> 
     <value name="Duck" count="1"/> 
     <value name="Dove" count="2"/> 
    </Added> 
    <Deleted> 
     <value name="crow" count="1"/> 
     <value name="crane" count="10"/> 
    </Deleted> 
    </fixed> 
    <fixed NameCategory="Humans"> 
    <value name="john" count="1"/> 
    </fixed> 
</root> 

표시 추가 새 :

xmlstarlet select --template --value-of "//root/fixed[@NameCategory='Birds']/Added/value/@name" --nl file.xml 

출력 :

 
Duck 
Dove 

012 3,516,

카운트 추가 새 :

xmlstarlet select --template --value-of "count(//root/fixed[@NameCategory='Birds']/Added/value/@name)" file.xml 

출력 :

 
2 

카운트 추가 한 명령으로 조류와 인간을 삭제 :

xmlstarlet select --template \ 
    --value-of "count(//root/fixed[@NameCategory='Birds']/Added/value/@name)" --nl \ 
    --value-of "count(//root/fixed[@NameCategory='Birds']/Added/value/@name)" --nl \ 
    --value-of "count(//root/fixed[@NameCategory='Humans']/value/@name)" --nl file.xml 

출력 :

앞에 둔 텍스트와

:

xmlstarlet select --template \ 
    --value-of "concat('Total No Of Added Birds=',count(//root/fixed[@NameCategory='Birds']/Added/value/@name))" --nl \ 
    --value-of "concat('Total No Of Deleted Birds=',count(//root/fixed[@NameCategory='Birds']/Deleted/value/@name))" --nl \ 
    --value-of "concat('Total No Of Added Humans=',count(//root/fixed[@NameCategory='Humans']/value/@name))" --nl file.xml 

출력 :

 
Total No Of Added Birds=2 
Total No Of Deleted Birds=2 
Total No Of Added Humans=1 

참조 : xmlstarlet select --help

+0

좋은 답변입니다. 'xml' 루트 요소는 거의 틀림없이 XML 선언 ('')이었습니다. 그래도 복원되면 대체 XML 루트 요소가 있어야합니다. – kjhughes

+0

@kjhughes : 고마워. 나는 이것을 고쳤다. – Cyrus