网上查找众多资料后是一头雾水,在翻看了tdom的sample例子两天之后,终于清晰了一些 , 总结了一点:
1:需求:传入任意个偶数参数 , 创建下面的XML数据
<?xml version="1.0"?>
<TestRecord>
<TResult>
<ParameterName>TestResult</ParameterName>
<Value>0</Value>
<ParameterName>2412_11M_FreqErr</ParameterName>
<Value>6.27</Value>
<ParameterName>2412_11M_Power</ParameterName>
<Value>19.37</Value>
<ParameterName>小红</ParameterName>
<Value>18岁</Value>
<ParameterName>功率</ParameterName>
<Value>20.11dBm</Value>
<ParameterName>频偏</ParameterName>
<Value>1.20ppm</Value>
</TResult>
</TestRecord>
接口 : GetXML [list "参数一" "值1" "参数二" "值二","参数三" "值三"]
实现
proc GetXML {argv} {
if {[expr [llength $argv] % 2] != 0 } {
puts "argv len wroung"
return -1
}
dom createDocument "TestRecord" doc
set root [$doc documentElement]
set node [$doc createElement "TResult"]
$root appendChild $node
foreach {k v} $argv {
set nodeKey [$doc createElement "ParameterName"]
set nodeValue [$doc createElement "Value"]
$node appendChild $nodeKey
$node appendChild $nodeValue
$node appendChild $nodeKey
$node appendChild $nodeValue
set textKey [$doc createTextNode $k]
set textValue [$doc createTextNode $v]
$nodeKey appendChild $textKey
$nodeValue appendChild $textValue
}
set reXML [$doc asXML]
$doc delete
return $reXML
}
下面是测试代码:
set testData [list "TestResult" "0" "2412_11M_FreqErr" "6.27" "2412_11M_Power" "19.37" "小红" "18" "功率" "20.11dBm" "频偏" "1.20ppm"]
set header {<?xml version="1.0" encoding="utf-8"?>}
set testData [append header \n[GetXML $testData]]
puts $testData
效果:
2:需求 给定XML文档,解析出其中的给定元素
给定XML文档
<?xml version="1.0"?>
<TestRecord>
<TResult>
<名称>小红</名称>
<年龄>18</年龄>
<城市>深圳</城市>
<height>172cm</height>
</TResult>
<TResult>
<名称>小兰</名称>
<年龄>20</年龄>
<城市>成都</城市>
<height>167cm</height>
</TResult>
</TestRecord>
这个就暂时随手简单实现了一下
实现:
set xmlText {<?xml version="1.0"?>
<TestRecord>
<TResult>
<名称>小红</名称>
<年龄>18</年龄>
<城市>深圳</城市>
<height>172cm</height>
</TResult>
<TResult>
<名称>小兰</名称>
<年龄>20</年龄>
<城市>成都</城市>
<height>167cm</height>
</TResult>
</TestRecord>}
#解析
set doc [dom parse $xmlText]
set root [$doc documentElement]
#第一个 数据节点查找
set node [$root firstChild]
set name [$node getElementsByTagName "名称"]
set age [$node getElementsByTagName "年龄"]
puts [$name text]
puts [$age text]
#下一个数据节点 查找
set node [$node nextSibling]
set city [$node getElementsByTagName "城市"]
set height [$node getElementsByTagName "height"]
puts [$city text]
puts [$height text]
$doc delete
效果:
当然 , 还有更加复杂的XML格式和更加简单地实现, 欢迎讨论.