我的XML文件:
<?xml version="1.0"?>
<root>
<msg>
<MessageError>
<BookingID>123</BookingID>
<Error>Invalid patient name</Error>
<Error>PATIENT NOT FOUND</Error>
<Message>Incoming MESSAGE DATA 1</Message>
</MessageError>
<MessageError>
<BookingID>456</BookingID>
<Error>Undefined patient account number.</Error>
<Error>Undefined Account Number</Error>
<Message>Incoming MESSAGE DATA 2</Message>
</MessageError>
<MessageError>
<BookingID>789</BookingID>
<Error>DOB invalid</Error>
<Message>Incoming MESSAGE DATA 3</Message>
</MessageError>
</msg>
</root>
我的tcl脚本:
set dom [dom parse $msg]
set root [$dom documentElement]
set MessageError [$root selectNodes "/root/msg/MessageError" ]
foreach node $MessageError {
set Error [$root selectNodes {/root/msg/MessageError/Error} ]
#set bookingid [$MessageError text]
#echo "BookingIDXML - $bookingid"
#set message [$MessageError text]
#echo "MessageXML - $message"
foreach errornode $Error {
set error [$errornode text]
echo "ErrorXML - $error"
}
}
我的输出:
ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid
ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid
ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid
互联网上缺少此功能强大的工具的文档。如何获得输出?我的代码中带注释的“#”部分无效。
BookingIDXML - 123
ErrorXML - Invalid patient name
MessageXML - Incoming MESSAGE DATA 1
BookingIDXML - 123
ErrorXML - PATIENT NOT FOUND
MessageXML - Incoming MESSAGE DATA 1
BookingIDXML - 456
ErrorXML - Undefined patient account number.
MessageXML - Incoming MESSAGE DATA 2
BookingIDXML - 465
ErrorXML - Undefined Account Number
MessageXML - Incoming MESSAGE DATA 2
BookingIDXML - 789
ErrorXML - DOB invalid
MessageXML - Incoming MESSAGE DATA 3
提前致谢。
最佳答案
selectNodes
方法使用XPath(有据可查)来查找要返回的结果,上下文节点是调用该方法的对象。因此,要查找特定Error
的MessageError
节点,必须从正确的位置开始。特别是,您可能希望代码执行以下操作:
foreach messageError [$root selectNodes "/root/msg/MessageError"] {
# Print some general info (to separate error groups)
set bookingID [lindex [$messageError selectNodes "BookingID"] 0]
puts "ID: [$bookingID text]"
set message [lindex [$messageError selectNodes "Message"] 0]
puts "Message: [$message text]"
# Print the errors
foreach error [$messageError selectNodes "Error"] {
puts "Error: [$error text]"
}
}
如果愿意,可以使用
./Error
而不是Error
作为XPath搜索术语。效果是一样的,但看起来有点像一条路径。您不应该做的是从文档的根开始搜索(就像/root/msg/MessageError/Error
那样),因为然后您会找到与该路径匹配的所有内容,而不仅是当前子上下文中的位。 (认为子上下文有点像文件系统中的当前目录,而元素有点像目录;这只是部分类比-DOM树不是目录,但还是有点类比。)
关于xml - 在TCL tDOM中解析具有多个子项的XML数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16234178/