mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-29 11:41:22 +03:00
added the close and getattribute methods of XmlTextReader. added the
* xmlreader.c doc/libxml2-api.xml: added the close and getattribute methods of XmlTextReader. * python/generator.py python/libxml_wrap.h python/types.c python/libxml2class.txt: added the reader to the Python bindings * python/tests/Makefile.am python/tests/reader.py: added a specific test for the Python bindings of the Reader APIs * parser.c: small cleanup. Daniel
This commit is contained in:
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
Sat Dec 14 23:57:39 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* xmlreader.c doc/libxml2-api.xml: added the close and getattribute
|
||||||
|
methods of XmlTextReader.
|
||||||
|
* python/generator.py python/libxml_wrap.h python/types.c
|
||||||
|
python/libxml2class.txt: added the reader to the Python bindings
|
||||||
|
* python/tests/Makefile.am python/tests/reader.py: added a specific
|
||||||
|
test for the Python bindings of the Reader APIs
|
||||||
|
* parser.c: small cleanup.
|
||||||
|
|
||||||
Fri Dec 13 11:39:44 CET 2002 Daniel Veillard <daniel@veillard.com>
|
Fri Dec 13 11:39:44 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* xinclude.c: fallback was only copying the first child not the
|
* xinclude.c: fallback was only copying the first child not the
|
||||||
|
@ -1093,7 +1093,11 @@
|
|||||||
<exports symbol='xmlTextReader'/>
|
<exports symbol='xmlTextReader'/>
|
||||||
<exports symbol='xmlTextReaderAttributeCount'/>
|
<exports symbol='xmlTextReaderAttributeCount'/>
|
||||||
<exports symbol='xmlTextReaderBaseUri'/>
|
<exports symbol='xmlTextReaderBaseUri'/>
|
||||||
|
<exports symbol='xmlTextReaderClose'/>
|
||||||
<exports symbol='xmlTextReaderDepth'/>
|
<exports symbol='xmlTextReaderDepth'/>
|
||||||
|
<exports symbol='xmlTextReaderGetAttribute'/>
|
||||||
|
<exports symbol='xmlTextReaderGetAttributeNo'/>
|
||||||
|
<exports symbol='xmlTextReaderGetAttributeNs'/>
|
||||||
<exports symbol='xmlTextReaderHasAttributes'/>
|
<exports symbol='xmlTextReaderHasAttributes'/>
|
||||||
<exports symbol='xmlTextReaderHasValue'/>
|
<exports symbol='xmlTextReaderHasValue'/>
|
||||||
<exports symbol='xmlTextReaderIsDefault'/>
|
<exports symbol='xmlTextReaderIsDefault'/>
|
||||||
@ -7876,11 +7880,35 @@ actually an xmlCharEncoding'/>
|
|||||||
<return type='xmlChar *' info='the base URI or NULL if not available'/>
|
<return type='xmlChar *' info='the base URI or NULL if not available'/>
|
||||||
<arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
|
<arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
|
||||||
</function>
|
</function>
|
||||||
|
<function name='xmlTextReaderClose' file='xmlreader'>
|
||||||
|
<info>This method releases any resources allocated by the current instance changes the state to Closed and close any underlying input.</info>
|
||||||
|
<return type='int' info='0 or -1 in case of error'/>
|
||||||
|
<arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
|
||||||
|
</function>
|
||||||
<function name='xmlTextReaderDepth' file='xmlreader'>
|
<function name='xmlTextReaderDepth' file='xmlreader'>
|
||||||
<info>The depth of the node in the tree.</info>
|
<info>The depth of the node in the tree.</info>
|
||||||
<return type='int' info='the depth or -1 in case of error'/>
|
<return type='int' info='the depth or -1 in case of error'/>
|
||||||
<arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
|
<arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
|
||||||
</function>
|
</function>
|
||||||
|
<function name='xmlTextReaderGetAttribute' file='xmlreader'>
|
||||||
|
<info>Provides the value of the attribute with the specified qualified name.</info>
|
||||||
|
<return type='xmlChar *' info='a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.'/>
|
||||||
|
<arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
|
||||||
|
<arg name='name' type='const xmlChar *' info='the qualified name of the attribute.'/>
|
||||||
|
</function>
|
||||||
|
<function name='xmlTextReaderGetAttributeNo' file='xmlreader'>
|
||||||
|
<info>Provides the value of the attribute with the specified index relative to the containing element.</info>
|
||||||
|
<return type='xmlChar *' info='a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.'/>
|
||||||
|
<arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
|
||||||
|
<arg name='no' type='int' info='the zero-based index of the attribute relative to the containing element'/>
|
||||||
|
</function>
|
||||||
|
<function name='xmlTextReaderGetAttributeNs' file='xmlreader'>
|
||||||
|
<info>Provides the value of the specified attribute</info>
|
||||||
|
<return type='xmlChar *' info='a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.'/>
|
||||||
|
<arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
|
||||||
|
<arg name='localName' type='const xmlChar *' info='the local name of the attribute.'/>
|
||||||
|
<arg name='namespaceURI' type='const xmlChar *' info='the namespace URI of the attribute.'/>
|
||||||
|
</function>
|
||||||
<function name='xmlTextReaderHasAttributes' file='xmlreader'>
|
<function name='xmlTextReaderHasAttributes' file='xmlreader'>
|
||||||
<info>Whether the node has attributes.</info>
|
<info>Whether the node has attributes.</info>
|
||||||
<return type='int' info='1 if true, 0 if false, and -1 in case or error'/>
|
<return type='int' info='1 if true, 0 if false, and -1 in case or error'/>
|
||||||
|
@ -49,6 +49,18 @@ xmlChar * xmlTextReaderPrefix (xmlTextReaderPtr reader);
|
|||||||
int xmlTextReaderQuoteChar (xmlTextReaderPtr reader);
|
int xmlTextReaderQuoteChar (xmlTextReaderPtr reader);
|
||||||
xmlChar * xmlTextReaderValue (xmlTextReaderPtr reader);
|
xmlChar * xmlTextReaderValue (xmlTextReaderPtr reader);
|
||||||
xmlChar * xmlTextReaderXmlLang (xmlTextReaderPtr reader);
|
xmlChar * xmlTextReaderXmlLang (xmlTextReaderPtr reader);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methods of the XmlTextReader
|
||||||
|
*/
|
||||||
|
int xmlTextReaderClose (xmlTextReaderPtr reader);
|
||||||
|
xmlChar * xmlTextReaderGetAttributeNo (xmlTextReaderPtr reader,
|
||||||
|
int no);
|
||||||
|
xmlChar * xmlTextReaderGetAttribute (xmlTextReaderPtr reader,
|
||||||
|
const xmlChar *name);
|
||||||
|
xmlChar * xmlTextReaderGetAttributeNs (xmlTextReaderPtr reader,
|
||||||
|
const xmlChar *localName,
|
||||||
|
const xmlChar *namespaceURI);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
9
parser.c
9
parser.c
@ -1769,7 +1769,8 @@ xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix) {
|
|||||||
int first = CUR_SCHAR(cur, l);
|
int first = CUR_SCHAR(cur, l);
|
||||||
|
|
||||||
if (!IS_LETTER(first) && (first != '_')) {
|
if (!IS_LETTER(first) && (first != '_')) {
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
if ((ctxt != NULL) && (ctxt->sax != NULL) &&
|
||||||
|
(ctxt->sax->error != NULL))
|
||||||
ctxt->sax->error(ctxt->userData,
|
ctxt->sax->error(ctxt->userData,
|
||||||
"Name %s is not XML Namespace compliant\n",
|
"Name %s is not XML Namespace compliant\n",
|
||||||
name);
|
name);
|
||||||
@ -1790,7 +1791,8 @@ xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix) {
|
|||||||
|
|
||||||
buffer = (xmlChar *) xmlMalloc(max * sizeof(xmlChar));
|
buffer = (xmlChar *) xmlMalloc(max * sizeof(xmlChar));
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
if ((ctxt != NULL) && (ctxt->sax != NULL) &&
|
||||||
|
(ctxt->sax->error != NULL))
|
||||||
ctxt->sax->error(ctxt->userData,
|
ctxt->sax->error(ctxt->userData,
|
||||||
"xmlSplitQName: out of memory\n");
|
"xmlSplitQName: out of memory\n");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
@ -1802,7 +1804,8 @@ xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix) {
|
|||||||
buffer = (xmlChar *) xmlRealloc(buffer,
|
buffer = (xmlChar *) xmlRealloc(buffer,
|
||||||
max * sizeof(xmlChar));
|
max * sizeof(xmlChar));
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
if ((ctxt != NULL) && (ctxt->sax != NULL) &&
|
||||||
|
(ctxt->sax->error != NULL))
|
||||||
ctxt->sax->error(ctxt->userData,
|
ctxt->sax->error(ctxt->userData,
|
||||||
"xmlSplitQName: out of memory\n");
|
"xmlSplitQName: out of memory\n");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
@ -271,6 +271,7 @@ py_types = {
|
|||||||
'xmlOutputBufferPtr': ('O', "outputBuffer", "xmlOutputBufferPtr", "xmlOutputBufferPtr"),
|
'xmlOutputBufferPtr': ('O', "outputBuffer", "xmlOutputBufferPtr", "xmlOutputBufferPtr"),
|
||||||
'xmlParserInputBufferPtr': ('O', "inputBuffer", "xmlParserInputBufferPtr", "xmlParserInputBufferPtr"),
|
'xmlParserInputBufferPtr': ('O', "inputBuffer", "xmlParserInputBufferPtr", "xmlParserInputBufferPtr"),
|
||||||
'xmlRegexpPtr': ('O', "xmlReg", "xmlRegexpPtr", "xmlRegexpPtr"),
|
'xmlRegexpPtr': ('O', "xmlReg", "xmlRegexpPtr", "xmlRegexpPtr"),
|
||||||
|
'xmlTextReaderPtr': ('O', "xmlTextReader", "xmlTextReaderPtr", "xmlTextReaderPtr"),
|
||||||
}
|
}
|
||||||
|
|
||||||
py_return_types = {
|
py_return_types = {
|
||||||
@ -597,6 +598,7 @@ classes_type = {
|
|||||||
"xmlOutputBufferPtr": ("._o", "outputBuffer(_obj=%s)", "outputBuffer"),
|
"xmlOutputBufferPtr": ("._o", "outputBuffer(_obj=%s)", "outputBuffer"),
|
||||||
"xmlParserInputBufferPtr": ("._o", "inputBuffer(_obj=%s)", "inputBuffer"),
|
"xmlParserInputBufferPtr": ("._o", "inputBuffer(_obj=%s)", "inputBuffer"),
|
||||||
"xmlRegexpPtr": ("._o", "xmlReg(_obj=%s)", "xmlReg"),
|
"xmlRegexpPtr": ("._o", "xmlReg(_obj=%s)", "xmlReg"),
|
||||||
|
"xmlTextReaderPtr": ("._o", "xmlTextReader(_obj=%s)", "xmlTextReader"),
|
||||||
}
|
}
|
||||||
|
|
||||||
converter_type = {
|
converter_type = {
|
||||||
@ -624,6 +626,7 @@ classes_destructors = {
|
|||||||
# "outputBuffer": "xmlOutputBufferClose",
|
# "outputBuffer": "xmlOutputBufferClose",
|
||||||
"inputBuffer": "xmlFreeParserInputBuffer",
|
"inputBuffer": "xmlFreeParserInputBuffer",
|
||||||
"xmlReg": "xmlRegFreeRegexp",
|
"xmlReg": "xmlRegFreeRegexp",
|
||||||
|
"xmlTextReader": "xmlFreeTextReader",
|
||||||
}
|
}
|
||||||
|
|
||||||
functions_noexcept = {
|
functions_noexcept = {
|
||||||
@ -676,6 +679,9 @@ def nameFixup(name, classe, type, file):
|
|||||||
func = "regexp" + name[9:]
|
func = "regexp" + name[9:]
|
||||||
elif name[0:6] == "xmlReg" and file == "xmlregexp":
|
elif name[0:6] == "xmlReg" and file == "xmlregexp":
|
||||||
func = "regexp" + name[6:]
|
func = "regexp" + name[6:]
|
||||||
|
elif name[0:13] == "xmlTextReader" and file == "xmlreader":
|
||||||
|
func = name[13:]
|
||||||
|
func = string.lower(func[0:1]) + func[1:]
|
||||||
elif name[0:11] == "xmlACatalog":
|
elif name[0:11] == "xmlACatalog":
|
||||||
func = name[11:]
|
func = name[11:]
|
||||||
func = string.lower(func[0:1]) + func[1:]
|
func = string.lower(func[0:1]) + func[1:]
|
||||||
|
@ -165,6 +165,9 @@ registerDefaultInputCallbacks()
|
|||||||
registerDefaultOutputCallbacks()
|
registerDefaultOutputCallbacks()
|
||||||
registerHTTPPostCallbacks()
|
registerHTTPPostCallbacks()
|
||||||
|
|
||||||
|
# functions from module xmlreader
|
||||||
|
newTextReaderFilename()
|
||||||
|
|
||||||
# functions from module xmlregexp
|
# functions from module xmlregexp
|
||||||
regexpCompile()
|
regexpCompile()
|
||||||
|
|
||||||
@ -556,6 +559,30 @@ Class xmlAttr(xmlNode)
|
|||||||
freeProp()
|
freeProp()
|
||||||
freePropList()
|
freePropList()
|
||||||
removeProp()
|
removeProp()
|
||||||
|
Class xmlTextReader()
|
||||||
|
|
||||||
|
# functions from module xmlreader
|
||||||
|
attributeCount()
|
||||||
|
baseUri()
|
||||||
|
close()
|
||||||
|
depth()
|
||||||
|
freeTextReader()
|
||||||
|
getAttribute()
|
||||||
|
getAttributeNo()
|
||||||
|
getAttributeNs()
|
||||||
|
hasAttributes()
|
||||||
|
hasValue()
|
||||||
|
isDefault()
|
||||||
|
isEmptyElement()
|
||||||
|
localName()
|
||||||
|
name()
|
||||||
|
namespaceUri()
|
||||||
|
nodeType()
|
||||||
|
prefix()
|
||||||
|
quoteChar()
|
||||||
|
read()
|
||||||
|
value()
|
||||||
|
xmlLang()
|
||||||
Class xmlReg()
|
Class xmlReg()
|
||||||
|
|
||||||
# functions from module xmlregexp
|
# functions from module xmlregexp
|
||||||
@ -731,6 +758,9 @@ Class inputBuffer(ioReadWrapper)
|
|||||||
push()
|
push()
|
||||||
read()
|
read()
|
||||||
|
|
||||||
|
# functions from module xmlreader
|
||||||
|
newTextReader()
|
||||||
|
|
||||||
|
|
||||||
Class outputBuffer(ioWriteWrapper)
|
Class outputBuffer(ioWriteWrapper)
|
||||||
|
|
||||||
|
@ -17,6 +17,26 @@
|
|||||||
#include <libxml/xmlunicode.h>
|
#include <libxml/xmlunicode.h>
|
||||||
#include <libxml/xmlregexp.h>
|
#include <libxml/xmlregexp.h>
|
||||||
#include <libxml/xmlautomata.h>
|
#include <libxml/xmlautomata.h>
|
||||||
|
#include <libxml/xmlreader.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ATTRIBUTE_UNUSED:
|
||||||
|
*
|
||||||
|
* Macro used to signal to GCC unused function parameters
|
||||||
|
* Repeated here since the definition is not available when
|
||||||
|
* compiled outside the libxml2 build tree.
|
||||||
|
*/
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#ifdef ATTRIBUTE_UNUSED
|
||||||
|
#undef ATTRIBUTE_UNUSED
|
||||||
|
#endif
|
||||||
|
#include <ansidecl.h>
|
||||||
|
#ifndef ATTRIBUTE_UNUSED
|
||||||
|
#define ATTRIBUTE_UNUSED
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define ATTRIBUTE_UNUSED
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PyxmlNode_Get(v) (((v) == Py_None) ? NULL : \
|
#define PyxmlNode_Get(v) (((v) == Py_None) ? NULL : \
|
||||||
(((PyxmlNode_Object *)(v))->obj))
|
(((PyxmlNode_Object *)(v))->obj))
|
||||||
@ -66,6 +86,14 @@ typedef struct {
|
|||||||
xmlRegexpPtr obj;
|
xmlRegexpPtr obj;
|
||||||
} PyxmlReg_Object;
|
} PyxmlReg_Object;
|
||||||
|
|
||||||
|
#define PyxmlTextReader_Get(v) (((v) == Py_None) ? NULL : \
|
||||||
|
(((PyxmlTextReader_Object *)(v))->obj))
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
xmlTextReaderPtr obj;
|
||||||
|
} PyxmlTextReader_Object;
|
||||||
|
|
||||||
#define PyURI_Get(v) (((v) == Py_None) ? NULL : \
|
#define PyURI_Get(v) (((v) == Py_None) ? NULL : \
|
||||||
(((PyURI_Object *)(v))->obj))
|
(((PyURI_Object *)(v))->obj))
|
||||||
|
|
||||||
@ -119,5 +147,6 @@ PyObject * libxml_xmlURIPtrWrap(xmlURIPtr uri);
|
|||||||
PyObject * libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer);
|
PyObject * libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer);
|
||||||
PyObject * libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer);
|
PyObject * libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer);
|
||||||
PyObject * libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp);
|
PyObject * libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp);
|
||||||
|
PyObject * libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader);
|
||||||
|
|
||||||
xmlXPathObjectPtr libxml_xmlXPathObjectPtrConvert(PyObject * obj);
|
xmlXPathObjectPtr libxml_xmlXPathObjectPtrConvert(PyObject * obj);
|
||||||
|
@ -19,7 +19,8 @@ PYTESTS= \
|
|||||||
outbuf.py \
|
outbuf.py \
|
||||||
inbuf.py \
|
inbuf.py \
|
||||||
resolver.py \
|
resolver.py \
|
||||||
regexp.py
|
regexp.py \
|
||||||
|
reader.py
|
||||||
|
|
||||||
XMLS= \
|
XMLS= \
|
||||||
tst.xml \
|
tst.xml \
|
||||||
|
94
python/tests/reader.py
Executable file
94
python/tests/reader.py
Executable file
@ -0,0 +1,94 @@
|
|||||||
|
#!/usr/bin/python -u
|
||||||
|
import libxml2
|
||||||
|
import StringIO
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Memory debug specific
|
||||||
|
libxml2.debugMemory(1)
|
||||||
|
|
||||||
|
f = StringIO.StringIO("""<a><b b1="b1"/><c>content of c</c></a>""")
|
||||||
|
input = libxml2.inputBuffer(f)
|
||||||
|
reader = input.newTextReader()
|
||||||
|
ret = reader.read()
|
||||||
|
if ret != 1:
|
||||||
|
print "Error reading to first element"
|
||||||
|
sys.exit(1)
|
||||||
|
if reader.name() != "a" or reader.isEmptyElement() != 0 or \
|
||||||
|
reader.nodeType() != 1 or reader.hasAttributes() != 0:
|
||||||
|
print "Error reading the first element"
|
||||||
|
sys.exit(1)
|
||||||
|
ret = reader.read()
|
||||||
|
if ret != 1:
|
||||||
|
print "Error reading to second element"
|
||||||
|
sys.exit(1)
|
||||||
|
if reader.name() != "b" or reader.isEmptyElement() != 1 or \
|
||||||
|
reader.nodeType() != 1 or reader.hasAttributes() != 1:
|
||||||
|
print "Error reading the second element"
|
||||||
|
sys.exit(1)
|
||||||
|
ret = reader.read()
|
||||||
|
if ret != 1:
|
||||||
|
print "Error reading to third element"
|
||||||
|
sys.exit(1)
|
||||||
|
if reader.name() != "c" or reader.isEmptyElement() != 0 or \
|
||||||
|
reader.nodeType() != 1 or reader.hasAttributes() != 0:
|
||||||
|
print "Error reading the third element"
|
||||||
|
sys.exit(1)
|
||||||
|
ret = reader.read()
|
||||||
|
if ret != 1:
|
||||||
|
print "Error reading to text node"
|
||||||
|
sys.exit(1)
|
||||||
|
if reader.name() != "#text" or reader.isEmptyElement() != 0 or \
|
||||||
|
reader.nodeType() != 3 or reader.hasAttributes() != 0 or \
|
||||||
|
reader.value() != "content of c":
|
||||||
|
print "Error reading the text node"
|
||||||
|
sys.exit(1)
|
||||||
|
ret = reader.read()
|
||||||
|
if ret != 1:
|
||||||
|
print "Error reading to end of third element"
|
||||||
|
sys.exit(1)
|
||||||
|
if reader.name() != "c" or reader.isEmptyElement() != 0 or \
|
||||||
|
reader.nodeType() != 15 or reader.hasAttributes() != 0:
|
||||||
|
print "Error reading the end of third element"
|
||||||
|
sys.exit(1)
|
||||||
|
ret = reader.read()
|
||||||
|
if ret != 1:
|
||||||
|
print "Error reading to end of first element"
|
||||||
|
sys.exit(1)
|
||||||
|
if reader.name() != "a" or reader.isEmptyElement() != 0 or \
|
||||||
|
reader.nodeType() != 15 or reader.hasAttributes() != 0:
|
||||||
|
print "Error reading the end of first element"
|
||||||
|
sys.exit(1)
|
||||||
|
ret = reader.read()
|
||||||
|
if ret != 0:
|
||||||
|
print "Error reading to end of document"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
#
|
||||||
|
# example from the XmlTextReader docs
|
||||||
|
#
|
||||||
|
f = StringIO.StringIO("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""")
|
||||||
|
input = libxml2.inputBuffer(f)
|
||||||
|
reader = input.newTextReader()
|
||||||
|
|
||||||
|
ret = reader.read()
|
||||||
|
if ret != 1:
|
||||||
|
print "Error reading test element"
|
||||||
|
sys.exit(1)
|
||||||
|
if reader.getAttributeNo(0) != "urn:datatypes" or \
|
||||||
|
reader.getAttributeNo(1) != "int" or \
|
||||||
|
reader.getAttributeNs("type", "urn:datatypes") != "int" or \
|
||||||
|
reader.getAttribute("dt:type") != "int":
|
||||||
|
print "error reading test attributes"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
del f
|
||||||
|
del input
|
||||||
|
del reader
|
||||||
|
|
||||||
|
# Memory debug specific
|
||||||
|
libxml2.cleanupParser()
|
||||||
|
if libxml2.debugMemory(1) == 0:
|
||||||
|
print "OK"
|
||||||
|
else:
|
||||||
|
print "Memory leak %d bytes" % (libxml2.debugMemory(1))
|
||||||
|
libxml2.dumpMemory()
|
@ -547,3 +547,21 @@ libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp)
|
|||||||
(char *) "xmlRegexpPtr", NULL);
|
(char *) "xmlRegexpPtr", NULL);
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader)
|
||||||
|
{
|
||||||
|
PyObject *ret;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("libxml_xmlTextReaderPtrWrap: reader = %p\n", reader);
|
||||||
|
#endif
|
||||||
|
if (reader == NULL) {
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return (Py_None);
|
||||||
|
}
|
||||||
|
ret =
|
||||||
|
PyCObject_FromVoidPtrAndDesc((void *) reader,
|
||||||
|
(char *) "xmlTextReaderPtr", NULL);
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
160
xmlreader.c
160
xmlreader.c
@ -53,7 +53,8 @@
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
XML_TEXTREADER_MODE_NORMAL = 0,
|
XML_TEXTREADER_MODE_NORMAL = 0,
|
||||||
XML_TEXTREADER_MODE_EOF = 1
|
XML_TEXTREADER_MODE_EOF = 1,
|
||||||
|
XML_TEXTREADER_MODE_CLOSED = 1
|
||||||
} xmlTextReaderMode;
|
} xmlTextReaderMode;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -473,6 +474,163 @@ xmlFreeTextReader(xmlTextReaderPtr reader) {
|
|||||||
xmlFree(reader);
|
xmlFree(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* *
|
||||||
|
* Methods for XmlTextReader *
|
||||||
|
* *
|
||||||
|
************************************************************************/
|
||||||
|
/**
|
||||||
|
* xmlTextReaderClose:
|
||||||
|
* @reader: the xmlTextReaderPtr used
|
||||||
|
*
|
||||||
|
* This method releases any resources allocated by the current instance
|
||||||
|
* changes the state to Closed and close any underlying input.
|
||||||
|
*
|
||||||
|
* Returns 0 or -1 in case of error
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlTextReaderClose(xmlTextReaderPtr reader) {
|
||||||
|
if (reader == NULL)
|
||||||
|
return(-1);
|
||||||
|
reader->node = NULL;
|
||||||
|
reader->mode = XML_TEXTREADER_MODE_CLOSED;
|
||||||
|
if (reader->ctxt != NULL) {
|
||||||
|
if (reader->ctxt->myDoc != NULL) {
|
||||||
|
xmlFreeDoc(reader->ctxt->myDoc);
|
||||||
|
reader->ctxt->myDoc = NULL;
|
||||||
|
}
|
||||||
|
if (reader->allocs & XML_TEXTREADER_CTXT) {
|
||||||
|
xmlFreeParserCtxt(reader->ctxt);
|
||||||
|
reader->allocs -= XML_TEXTREADER_CTXT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reader->sax != NULL) {
|
||||||
|
xmlFree(reader->sax);
|
||||||
|
reader->sax = NULL;
|
||||||
|
}
|
||||||
|
if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) {
|
||||||
|
xmlFreeParserInputBuffer(reader->input);
|
||||||
|
reader->allocs -= XML_TEXTREADER_INPUT;
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlTextReaderGetAttributeNo:
|
||||||
|
* @reader: the xmlTextReaderPtr used
|
||||||
|
* @no: the zero-based index of the attribute relative to the containing element
|
||||||
|
*
|
||||||
|
* Provides the value of the attribute with the specified index relative
|
||||||
|
* to the containing element.
|
||||||
|
*
|
||||||
|
* Returns a string containing the value of the specified attribute, or NULL
|
||||||
|
* in case of error. The string must be deallocated by the caller.
|
||||||
|
*/
|
||||||
|
xmlChar *
|
||||||
|
xmlTextReaderGetAttributeNo(xmlTextReaderPtr reader, int no) {
|
||||||
|
xmlChar *ret;
|
||||||
|
int i;
|
||||||
|
xmlAttrPtr cur;
|
||||||
|
xmlNsPtr ns;
|
||||||
|
|
||||||
|
if (reader == NULL)
|
||||||
|
return(NULL);
|
||||||
|
if (reader->node == NULL)
|
||||||
|
return(NULL);
|
||||||
|
/* TODO: handle the xmlDecl */
|
||||||
|
if (reader->node->type != XML_ELEMENT_NODE)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
ns = reader->node->nsDef;
|
||||||
|
for (i = 0;(i < no) && (ns != NULL);i++) {
|
||||||
|
ns = ns->next;
|
||||||
|
}
|
||||||
|
if (ns != NULL)
|
||||||
|
return(xmlStrdup(ns->href));
|
||||||
|
|
||||||
|
cur = reader->node->properties;
|
||||||
|
if (cur == NULL)
|
||||||
|
return(NULL);
|
||||||
|
for (;i < no;i++) {
|
||||||
|
cur = cur->next;
|
||||||
|
if (cur == NULL)
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
/* TODO walk the DTD if present */
|
||||||
|
|
||||||
|
ret = xmlNodeListGetString(reader->node->doc, cur->children, 1);
|
||||||
|
if (ret == NULL) return(xmlStrdup((xmlChar *)""));
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlTextReaderGetAttribute:
|
||||||
|
* @reader: the xmlTextReaderPtr used
|
||||||
|
* @name: the qualified name of the attribute.
|
||||||
|
*
|
||||||
|
* Provides the value of the attribute with the specified qualified name.
|
||||||
|
*
|
||||||
|
* Returns a string containing the value of the specified attribute, or NULL
|
||||||
|
* in case of error. The string must be deallocated by the caller.
|
||||||
|
*/
|
||||||
|
xmlChar *
|
||||||
|
xmlTextReaderGetAttribute(xmlTextReaderPtr reader, const xmlChar *name) {
|
||||||
|
xmlChar *prefix = NULL;
|
||||||
|
xmlChar *localname;
|
||||||
|
xmlNsPtr ns;
|
||||||
|
xmlChar *ret = NULL;
|
||||||
|
|
||||||
|
if ((reader == NULL) || (name == NULL))
|
||||||
|
return(NULL);
|
||||||
|
if (reader->node == NULL)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
/* TODO: handle the xmlDecl */
|
||||||
|
if (reader->node->type != XML_ELEMENT_NODE)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
localname = xmlSplitQName2(name, &prefix);
|
||||||
|
if (localname == NULL)
|
||||||
|
return(xmlGetProp(reader->node, name));
|
||||||
|
|
||||||
|
ns = xmlSearchNs(reader->node->doc, reader->node, prefix);
|
||||||
|
if (ns != NULL)
|
||||||
|
ret = xmlGetNsProp(reader->node, localname, ns->href);
|
||||||
|
|
||||||
|
if (localname != NULL)
|
||||||
|
xmlFree(localname);
|
||||||
|
if (prefix != NULL)
|
||||||
|
xmlFree(prefix);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlTextReaderGetAttributeNs:
|
||||||
|
* @reader: the xmlTextReaderPtr used
|
||||||
|
* @localName: the local name of the attribute.
|
||||||
|
* @namespaceURI: the namespace URI of the attribute.
|
||||||
|
*
|
||||||
|
* Provides the value of the specified attribute
|
||||||
|
*
|
||||||
|
* Returns a string containing the value of the specified attribute, or NULL
|
||||||
|
* in case of error. The string must be deallocated by the caller.
|
||||||
|
*/
|
||||||
|
xmlChar *
|
||||||
|
xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName,
|
||||||
|
const xmlChar *namespaceURI) {
|
||||||
|
if ((reader == NULL) || (localName == NULL))
|
||||||
|
return(NULL);
|
||||||
|
if (reader->node == NULL)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
/* TODO: handle the xmlDecl */
|
||||||
|
if (reader->node->type != XML_ELEMENT_NODE)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
return(xmlGetNsProp(reader->node, localName, namespaceURI));
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* *
|
* *
|
||||||
* Acces API to the current node *
|
* Acces API to the current node *
|
||||||
|
Reference in New Issue
Block a user