如何在xml中设置属性的默认值。考虑下面的test.xml。已为元素“to”定义了具有默认值“male”的属性“gender”。但是我无法使用xmlstarlet检索它。难道我做错了什么?请帮忙。
<?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
答案 0 :(得分: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
答案 1 :(得分:0)
不幸的是,XMLStarlet对默认命名空间非常挑剔。如果文档声明了它(xmlns =),则必须为XMLStarlet声明它,并在元素前面添加您选择的名称。 See这个
见User guide。 试试这个:
xml sel -T -t -m "/message/to" -v "@gender" -n test.xml
参考this
答案 2 :(得分:0)
xmlstarlet的sel
命令无法获取默认属性(至少是错误或缺失的功能)。您可以使用{Daniel}的解决方案中的tr
解决问题:
# bash allows a more concise solution than cmd.exe
xmlstarlet tr <(xmlstarlet sel -C -T -t -v /message/to/@gender) test.xml
或者通过c14n
运行它以获取默认属性值:
xmlstarlet c14n test.xml | xmlstarlet sel -T -t -v /message/to/@gender
从版本1.0.3开始的c14n
展开属性。 xmllint --dtdattr
可以改为工作。