2013-05-08 111 views
2

如何在xml中設置屬性的默認值。考慮下面的test.xml。已經爲元素「to」定義了一個屬性'gender',默認值爲'male'。然而,我無法使用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 CMD:(犯規打印任何東西到stdout)

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定義的屬性的默認值。 – 2013-05-08 08:53:31

+0

好的。對於默認的attr,你的代碼似乎很棒,發佈全代碼 – 2013-05-08 08:54:53

+1

的完整代碼?我希望xmlstarlet能夠解析xml,併爲我提供gender屬性的默認值,而不是。 – 2013-05-08 08:57:59

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 

或者運行它先得到默認屬性值:你可以解決它通過使用tr在@ DanielHaley的解決方案

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

c14n膨脹屬性從1.0.3版本開始。 xmllint --dtdattr可以改爲工作。

+0

當我嘗試時,出現語法分析器錯誤:'xmlstarlet tr <(xmlstarlet -C -T - t -v/message/to/@ gender)test.xml' _/dev/fd/63:1:解析器錯誤:Document is empty_ – 2013-05-09 05:10:51

+0

此外,規範化test.xml確實獲得了默認屬性:(所以正在運行通過c14n不幫助 – 2013-05-09 05:14:05

+0

以下cmds爲我工作,但我無法在一個cmd中簡潔地做到這一點。我很想知道一種方法來在單個cmd中執行此操作。 'xmlstar let sel -C -T -t -v/message/to/@ gender test.xml> test.xsl' 'xmlstarlet tr test.xsl test.xml' – 2013-05-10 07:48:10

相關問題