From: Francesco M. <f18...@ya...> - 2006-09-28 13:03:48
|
Ildar ha scritto: > hi all, > > I'm new here and might miss the page that describes what I need. Please, send > me the link to the page this case. > > > I'm playing with the following XML. > > <?xml version="1.0" encoding="utf-8"?> > <root> > <level1> > <level2-1>hello</level2-1> > </level1> > </root> > > I need to get the content of /root/level1/level2-1. > My code is as follows: > > wxXml2Document doc; > wxString err; > > doc.Load(wxT("****.xml"), &err); > > if (doc.IsOk()) > { > wxXml2Node node = doc.GetRoot(); > wxString s = node.Find(wxT("level2-1")).GetName(); > wxString s1 = node.Find(wxT("level2-1")).GetContent(); > wxString s2 = node.Find(wxT("level2-1")).GetFirstChild().GetContent(); > } > > the results are: > > s == "level2-1" // the same as expected > s1 == "" // I expected to get "hello" > s2 == "hello" // ? yes, sure. no bugs. This is really a FAQ and I should add it somewhere. The results you get are because your XML tree is parsed as: wxXML_ELEMENT_NODE with name "root" and content="" |- wxXML_ELEMENT_NODE with name "level1" and content="" |- wxXML_ELEMENT_NODE with name "level2-1" and content="" |- wxXML_TEXT_NODE with name "" and content="hello" Thus, if the node is an element node, you shouldn't look at its contents but rather at its children. If the node is a text node, the name is empty (or maybe fixed to "text", I don't remember) and you should just look at his contents. I've added in CVS the GetNodeContent() function which simplifies the process (see below). > The way I'm accessing the value is quite weird and doesn't seem to be safe... > > Is there an easier way? wxXml2Node child = doc.GetRoot(); while (child != wxXml2EmptyNode) { if (child.GetName() == wxT("level1")) { // process text enclosed by <level1> wxString content = child->GetNodeContent(); } else if (child->GetName() == wxT("tag2")) { // process tag2 ... } else { // unknown tag? } child = child.GetNext(); } this pattern allows you to scan each node of the XML and e.g. catch structural errors (e.g. you can check for unknown tags). Francesco |