34 #include <sys/types.h>
50 enum XmlNodeType {ntNone = TiXmlNode::TINYXML_UNKNOWN,
51 ntElmBeg = TiXmlNode::TINYXML_ELEMENT,
53 ntText = TiXmlNode::TINYXML_TEXT,
54 ntCmt = TiXmlNode::TINYXML_COMMENT,
55 ntDoc = TiXmlNode::TINYXML_DOCUMENT,
56 ntXMLDcl = TiXmlNode::TINYXML_DECLARATION
63 const char *NodeName(
int ntype)
66 {
case ntNone:
return "isNode ";
break;
67 case ntElmBeg:
return "isElmBeg";
break;
68 case ntText:
return "isText ";
break;
69 case ntCmt:
return "isCmt ";
break;
70 case ntDoc:
return "isDoc ";
break;
71 case ntElmEnd:
return "isElmEnd";
break;
72 case ntXMLDcl:
return "isXMLDcl";
break;
95 debug = getenv(
"XrdXmlDEBUG") != 0;
101 snprintf(eText,
sizeof(eText),
"%s opening %s",
XrdSysE2T(errno), fname);
108 reader =
new TiXmlDocument(fname);
109 if (reader->LoadFile())
110 {curNode = (TiXmlNode *)reader;
115 if (!(etext = reader->ErrorDesc()) || *etext)
116 {
if ((eCode = errno)) etext =
XrdSysE2T(errno);
117 else etext =
"Unknown error";
119 snprintf(eText,
sizeof(eText),
"%s opening %s", etext, fname);
145 void XrdXmlRdrTiny::Debug(
const char *hdr,
const char *want,
const char *have,
146 const char *scope,
int nType)
152 snprintf(buff,
sizeof(buff),
"%s %s scope: %s want: %s have: %s\n",
153 hdr,NodeName(nType),scope,want,have);
154 std::cerr <<buff <<std::flush;
170 {snprintf(eText,
sizeof(eText),
171 "Element not fetched when seeking attribute %s",aname[0]);
179 {
if ((value = curElem->Attribute(aname[i])))
180 {
if (aval[i]) free(aval[i]);
181 aval[i] = strdup(value);
199 const char *name = (curNode ? curNode->Value() : 0);
206 {
if (name && strcmp(name, ename[0]))
207 {
if (curElem && !strcmp(elmNode->Value(),ename[0])) curNode = elmNode;
208 else {snprintf(eText,
sizeof(eText),
209 "Current context '%s' does not match stated scope '%s'",
210 (name ? name :
""), ename[0]);
219 if (curNode == elmNode ) theChild = curNode->FirstChild();
220 else if (elmNode) theChild = elmNode->NextSibling();
221 else theChild = curNode->NextSibling();
227 {
if ((name = theChild->Value()) && theChild->Type() == ntElmBeg)
229 while(ename[i] && strcmp(name, ename[i])) i++;
231 {
if (debug)
Debug(
"getelem:",ename[i],name,ename[0],ntElmBeg);
232 curElem = theChild->ToElement();
237 theChild = theChild->NextSibling();
243 if (debug)
Debug(
"getelem:",ename[1],ename[0],ename[0],ntElmEnd);
245 curNode = curNode->Parent();
252 {snprintf(eText,
sizeof(eText),
"Required element '%s' not found in '%s'",
253 (ename[1] ? ename[1] :
"???"), ename[0]);
271 {snprintf(eText,
sizeof(eText),
272 "Illegal position seeking text for tag %s",ename);
279 value = curElem->GetText();
284 {
if (!value)
return 0;
291 snprintf(eText,
sizeof(eText),
"Required %s tag value not found", ename);
int stat(const char *path, struct stat *buf)
const char * XrdSysE2T(int errcode)
XrdXmlRdrTiny(bool &aOK, const char *fname, const char *enc=0)
Constructor & Destructor.
virtual bool GetAttributes(const char **aname, char **aval)
virtual int GetElement(const char **ename, bool reqd=false)
virtual char * GetText(const char *ename, bool reqd=false)