Hi Josef,

2010/12/22 Josef Kokeš <[email protected]>:
> Hi!
>
> I am having problem with XmlTextReader, if my XML file has elements in the
> form of <name atr1="value1" atr2="value2" ... /> or even just <name />: I
> just can't detect the end of such an element.

It doesn't have one; rather, there is no corresponding
XML_READER_TYPE_END_ELEMENT.

> I am reading the XML file in a
> loop, in which I call xmlTextReaderRead followed by xmlTextReaderNodeType,
> and after that I process the node according to its type. My problem is that
> I have two situations which are completely different semantically but get
> the same result from XmlTextReader:
>
> Situation A:
> <root>
>  <elem1 />
>  <elem2>...</elem2>
> </root
>
> Situation B:
> <root>
>  <elem1>
>    <elem2>...</elem2>
>  </elem1>
> </root
>
> The output of xmlTextReaderNodeType for situation A:
> - XML_READER_TYPE_ELEMENT (<root>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_ELEMENT (<elem1>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_ELEMENT (<elem2>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_END_ELEMENT (end of <elem2>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_END_ELEMENT (end of <root>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
>
> The output of xmlTextReaderNodeType for situation B:
> - XML_READER_TYPE_ELEMENT (<root>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_ELEMENT (<elem1>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_ELEMENT (<elem2>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_END_ELEMENT (end of <elem2>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_END_ELEMENT (end of <elem1>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)
> - XML_READER_TYPE_END_ELEMENT (end of <root>)
> - XML_READER_TYPE_SIGNIFICANT_WHITESPACE (end of line, indent)

These two outputs are not the same. There is one more
XML_READER_TYPE_END_ELEMENT in the second case.


> My problem is that in the first case I can't tell whether the last
> XML_READER_TYPE_END_ELEMENT applies to <root> or to <elem1>.

xmlTextReaderConstName would tell you that, perhaps together with
xmlTextReaderDepth. But you probably need to keep track of what is
happening anyway, because of XML like this:

<root>
 <elem1>foo</elem1>
 <elem1>bar</elem1>
</root>

or

<root>
  <elem1>
    <elem1>   ... </elem1>
  </elem1>
</root>

(in the first case  the second endElement belongs to the second
startElement, whereas in the second case the first endElement belongs
to the second startElement)

> I tried experimenting with xmlTextReaderHasValue and 
> xmlTextReaderIsEmptyElement,

You need to use xmlTextReaderIsEmptyElement when the type is
XML_READER_TYPE_ELEMENT.
If you are seeing a XML_READER_TYPE_END_ELEMENT, then that is the end
tag of a non-empty element so xmlTextReaderIsEmptyElement would always
be false.

> but neither seems to produce usable results in these situations. The only
> solution seems to be using xmlTextReaderDepth, but that does seem like a
> rather dirty way of detecting end of element. Is there any particular reason
> why won't libxml2 send me XML_READER_TYPE_END_ELEMENT when it encounters the
> /> part of <elem />?

Because there is no end element which begins with "</"


Hope this helps,
Csaba
-- 
GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml

Reply via email to