[c++] 使用TinyXml
今天跟學弟討論XML的document object 屬性數目問題。
首先回憶一下python DOM所描述的XML由上到下分成 Document -> Element(s) ->NodeList -> Node(s)
在python 裡頭,因為Document object是minidom lib自己建的,
取出某個Node的Attr或Text很容易。
而在TinyXml 裡頭要找做到相同的事情:
0. TiXmlDocument doc('mytest.xml') 建立Document obj
1. 使用 doc.Parse('mytest_xmlstring') 讀入xml並建立XML-tree
2. 要取得Element(s)可用
TiXmlElement *elem = doc.FirstChildElement() or
TiXmlElement *elem = doc.FirstChildElement('selected_element_name')
3. 要找某個Element obj裡頭特定Node的Attr or Text 可用
*Assume only one Element in elem
sp_attr_name, sp_attr_value
TiXmlAttribute *attr = elem->FirstChildAttribute('specified_element_name')
while (1):
if (!attr) break;
else{
if (attr->Name() == sp_attr_name) and (attr->Value() == sp_attr_value){
fprintf(stdout, "match.");
break;
}
attr = attr->Next();
}
但若欲找的Element object不只一個,只好再包一層Loop了... (有夠麻煩)
我的問題是,這跟 Element objects 彼此有相同的Name, 但是有不同數目的Attributes時,
去做parsing會有問題嗎?
我想應該是沒問題的,因為還是得一個一個取嘛... 並不會因為數目不同會造成需要維護
的資料結構改變(因為parsing是給TinyXml做的)...
不過在python做比較好啦,畢竟他比較高階,越底層盡量不要太複雜比較好,
anyway... 能多做就多做吧(茶...)
首先回憶一下python DOM所描述的XML由上到下分成 Document -> Element(s) ->NodeList -> Node(s)
在python 裡頭,因為Document object是minidom lib自己建的,
取出某個Node的Attr或Text很容易。
而在TinyXml 裡頭要找做到相同的事情:
0. TiXmlDocument doc('mytest.xml') 建立Document obj
1. 使用 doc.Parse('mytest_xmlstring') 讀入xml並建立XML-tree
2. 要取得Element(s)可用
TiXmlElement *elem = doc.FirstChildElement() or
TiXmlElement *elem = doc.FirstChildElement('selected_element_name')
3. 要找某個Element obj裡頭特定Node的Attr or Text 可用
*Assume only one Element in elem
sp_attr_name, sp_attr_value
TiXmlAttribute *attr = elem->FirstChildAttribute('specified_element_name')
while (1):
if (!attr) break;
else{
if (attr->Name() == sp_attr_name) and (attr->Value() == sp_attr_value){
fprintf(stdout, "match.");
break;
}
attr = attr->Next();
}
但若欲找的Element object不只一個,只好再包一層Loop了... (有夠麻煩)
我的問題是,這跟 Element objects 彼此有相同的Name, 但是有不同數目的Attributes時,
去做parsing會有問題嗎?
我想應該是沒問題的,因為還是得一個一個取嘛... 並不會因為數目不同會造成需要維護
的資料結構改變(因為parsing是給TinyXml做的)...
不過在python做比較好啦,畢竟他比較高階,越底層盡量不要太複雜比較好,
anyway... 能多做就多做吧(茶...)
Comments
Post a Comment