2013-05-08 3 views
2

xml의 속성에 대한 기본값을 어떻게 설정합니까? 아래 test.xml을 고려하십시오. 'to'요소에 대해 'male'이라는 속성 'gender'가 정의되었습니다. 그러나 xmlstarlet을 사용하여 검색 할 수는 없습니다. 내가 뭐 잘못하고 있니? 도와주세요.DTD를 사용하여 XML의 속성에 대한 기본값을 설정하는 방법은 무엇입니까?

<?xml version="1.0"?> 
<!DOCTYPE message [ 
    <!ELEMENT message (to,from,subject,text)> 
    <!ELEMENT to  (#PCDATA)> 
    <!ELEMENT from  (#PCDATA)> 
    <!ELEMENT subject (#PCDATA)> 
    <!ELEMENT text  (#PCDATA)> 
    <!ATTLIST to gender CDATA "male"> 
]> 

<message> 
    <to>Dave</to> 
    <from>Susan</from> 
    <subject>Reminder</subject> 
    <text>Dont forget to buy milk on the way home.</text> 
</message> 

xmlstarlet 명령 : (표준 출력 나던 인쇄 아무것도)

xmlstarlet sel -T -t -m "//message/to" -v "@gender" -n test.xml 

답변

1

기본 값으로 gender 속성의 귀하의 선언이 괜찮 참조하십시오. xmlstartlet의 sel 명령을 사용해야합니다. 그것 또는 그것을 사용하려는 방법. 나는 xmlstarlet에 대해 많이 모른다. 당신은 기본값을 확인하기 위해 XSLT를 사용할 수 있습니다

XML 입력 (test.xml의)

<!DOCTYPE message [ 
<!ELEMENT message (to,from,subject,text)> 
<!ELEMENT to  (#PCDATA)> 
<!ELEMENT from  (#PCDATA)> 
<!ELEMENT subject (#PCDATA)> 
<!ELEMENT text  (#PCDATA)> 
<!ATTLIST to gender CDATA "male"> 
]> 
<message> 
    <to>Dave</to> 
    <from>Susan</from> 
    <subject>Reminder</subject> 
    <text>Dont forget to buy milk on the way home.</text> 
</message> 

XSLT 1.0 (test.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
     <xsl:value-of select="to/@gender"/> 
    </xsl:template> 

</xsl:stylesheet> 

명령 줄 및 출력 (Windows의 경우 xmlstarlet)

C:\apps\xmlstarlet-1.4.2>xml tr test.xsl test.xml 
male 
0

불행하게도, XMLStarlet는 기본 네임 스페이스에 대해 매우 까다 롭고입니다. 문서에 선언 된 (xmlns =) 경우 XMLStarlet에 대해 문서를 선언해야하며 선택한 요소의 접두사를 접두사로 사용해야합니다. See this

User guide을 참조하십시오. 이 시도 :

xml sel -T -t -m "/message/to" -v "@gender" -n test.xml 

this

+0

속성 값을 고정하고 싶지 않습니다. 어떤 속성 값도 지정할 수 있지만, 필자의 질문에 언급 된 xmlstarlet cmd는 ATTLIST를 사용하여 정의 된 속성의 기본값을 반환해야합니다. –

+0

확인. 기본 attr 들어, 코드가 위대한 것, 전체 코드를 게시 –

+1

전체 코드? xmlstarlet이 xml을 구문 분석하고 gender 속성의 기본값을 가져 오길 바랬는데 그렇지 않습니다. –

0

xmlstarlet의 sel 명령에는 기본 속성 (버그 또는 누락 된 기능)을 가져올 수있는 방법이 없습니다. 첫째 기본 속성 값을 얻을 수 c14n를 통해

# bash allows a more concise solution than cmd.exe 
xmlstarlet tr <(xmlstarlet sel -C -T -t -v /message/to/@gender) test.xml 

또는 실행 : 당신은 @ DanielHaley의 솔루션으로 tr를 사용하여 해결할 수 있습니다

xmlstarlet c14n test.xml | xmlstarlet sel -T -t -v /message/to/@gender 

c14n가 확장 버전 1.0.3부터 속성 . 대신 xmllint --dtdattr을 사용할 수 있습니다.

+0

'로 이름을 바꿉니다'xmlstarlet TR <(xmlstarlet -C -T -/div/fd/63 : 1 : 파서 ​​오류 : 문서가 비어 있습니다. –

+0

또한 정규화 된 test.xml에는 기본 속성이 있습니다. (따라서 실행 중입니다. c14n 통해 도움이되지 않습니다 –

+0

나를 위해 일한 그러나 단일 cmd를 간결하게 할 수 없습니다. 단일 cmd를이 작업을 수행하는 방법을 알고 싶습니다. 'xmlstar 하자 셀프 -C -T -t -v/메시지// @ 성별 test.xml의> test.xsl' 'xmlstarlet 그럴 test.xsl test.xml' –

관련 문제