35 #include <libxml/xmlreader.h>
48 enum XmlNodeType {ntNone = XML_READER_TYPE_NONE,
49 ntElmBeg = XML_READER_TYPE_ELEMENT,
50 ntAttr = XML_READER_TYPE_ATTRIBUTE,
51 ntText = XML_READER_TYPE_TEXT,
52 ntCData = XML_READER_TYPE_CDATA,
53 ntEntRef = XML_READER_TYPE_ENTITY_REFERENCE,
54 ntEntBeg = XML_READER_TYPE_ENTITY,
55 ntPI = XML_READER_TYPE_PROCESSING_INSTRUCTION,
56 ntCmt = XML_READER_TYPE_COMMENT,
57 ntDoc = XML_READER_TYPE_DOCUMENT,
58 ntDTD = XML_READER_TYPE_DOCUMENT_TYPE,
59 ntDFrag = XML_READER_TYPE_DOCUMENT_FRAGMENT,
60 ntNote = XML_READER_TYPE_NOTATION,
61 ntWSpace = XML_READER_TYPE_WHITESPACE,
62 ntWSpSig = XML_READER_TYPE_SIGNIFICANT_WHITESPACE,
63 ntElmEnd = XML_READER_TYPE_END_ELEMENT,
64 ntEntEnd = XML_READER_TYPE_END_ENTITY,
65 ntXMLDcl = XML_READER_TYPE_XML_DECLARATION
72 const char *NodeName(
int ntype)
75 {
case ntNone:
return "isNode ";
break;
76 case ntElmBeg:
return "isElmBeg";
break;
77 case ntAttr:
return "isAttr ";
break;
78 case ntText:
return "isText ";
break;
79 case ntCData:
return "isCData ";
break;
80 case ntEntRef:
return "isEntRef";
break;
81 case ntEntBeg:
return "isEntBeg";
break;
82 case ntPI:
return "isPI ";
break;
83 case ntCmt:
return "isCmt ";
break;
84 case ntDoc:
return "isDoc ";
break;
85 case ntDTD:
return "isDTD ";
break;
86 case ntDFrag:
return "isDFrag ";
break;
87 case ntWSpace:
return "isWSpace";
break;
88 case ntWSpSig:
return "isWSpSig";
break;
89 case ntNote:
return "isNote ";
break;
90 case ntElmEnd:
return "isElmEnd";
break;
91 case ntEntEnd:
return "isEntEnd";
break;
92 case ntXMLDcl:
return "isXMLDcl";
break;
107 encType = (enc ? strdup(enc) : 0);
111 debug = getenv(
"XrdXmlDEBUG") != 0;
115 if (!(reader = xmlNewTextReaderFilename(fname)))
116 {
if ((eCode = errno))
117 {
size_t size =
sizeof(eText) - 1;
121 else strcpy(eText,
"Unknown error opening input file");
135 xmlFreeTextReader(reader); reader = 0;
142 void XrdXmlRdrXml2::Debug(
const char *hdr,
const char *want,
char *have,
143 const char *scope,
int nType)
149 snprintf(buff,
sizeof(buff),
"%s %s depth: %d scope: %s want: %s have: %s\n",
150 hdr,NodeName(nType),xmlTextReaderDepth(reader),scope,want,have);
151 std::cerr <<buff <<std::flush;
172 if (xmlTextReaderNodeType(reader) != ntElmBeg)
173 {snprintf(eText,
sizeof(eText),
174 "Illegal position seeking attribute %s",aname[0]);
181 while(xmlTextReaderMoveToNextAttribute(reader))
182 {
if ((name = GetName()))
184 while(aname[i] && strcmp(name, aname[i])) i++;
187 {
if (!(value = (
char *)xmlTextReaderValue(reader)))
continue;
190 {
if (aval[i]) free(aval[i]);
191 aval[i] = strdup(value);
194 if (aval[i]) xmlFree(aval[i]);
217 while(xmlTextReaderRead(reader) == 1)
218 {nType = xmlTextReaderNodeType(reader);
219 if (nType == ntWSpSig || !(name = GetName()))
continue;
221 if (nType == ntElmEnd)
222 {
if (debug) Debug(
"getelem:",ename[1],name,ename[0],nType);
223 if (!strcmp(name, ename[0]))
break;
225 else if (nType == ntElmBeg)
227 while(ename[i] && strcmp(name, ename[i])) i++;
229 {
if (debug) Debug(
"getelem:",ename[i],name,ename[0],nType);
233 if (debug) Debug(
"getelem:",ename[1],name,ename[0],nType);
240 if (name) xmlFree(name);
245 {snprintf(eText,
sizeof(eText),
"Required element '%s' not found in %s",
246 (ename[1] ? ename[1] :
"???"), ename[0]);
256 char *XrdXmlRdrXml2::GetName()
258 return (
char *)xmlTextReaderName(reader);
267 char *sP, *value = 0;
271 if (xmlTextReaderRead(reader) == 1
272 && xmlTextReaderNodeType(reader) == ntText)
273 {
if ((value = (
char *)xmlTextReaderValue(reader)) && !(*value))
274 {xmlFree(value); value = 0;}
280 {
if (!doDup || !value)
return value;
288 snprintf(eText,
sizeof(eText),
"Required %s tag text value not found",ename);
const char * XrdSysE2T(int errcode)
virtual char * GetText(const char *ename, bool reqd=false)
XrdXmlRdrXml2(bool &aOK, const char *fname, const char *enc=0)
Constructor & Destructor.
virtual int GetElement(const char **ename, bool reqd=false)
virtual void Free(void *strP)
virtual bool GetAttributes(const char **aname, char **aval)