XmlWordPatternFormatter.cc

Go to the documentation of this file.
00001 #include "LinguisticDefinition/XmlWordPatternFormatter.h"
00002 
00003 #include <iostream>
00004 
00005 using namespace std;
00006 using namespace LinguisticDefinition;
00007 
00011 XmlWordPatternFormatter::XmlWordPatternFormatter(const LingDef &lingDef) :
00012   WordPatternFormatter(lingDef) {
00013 }
00014 
00018 WordPattern XmlWordPatternFormatter::createWordPattern(xmlNodePtr node) {
00019   WordPattern expression;
00020   populateWordPattern(node, expression);
00021   return expression;
00022 }
00023 
00027 bool XmlWordPatternFormatter::populateWordPattern(xmlNodePtr node,
00028                                                   WordPattern &wordPattern) {
00029 
00030   const LingDef::Pos *posDef = NULL;
00031   go(node, wordPattern.getModifiableRootElement(), posDef);
00032 
00033   return true;
00034 }
00035 
00039 bool XmlWordPatternFormatter::go(xmlNodePtr node,
00040                                  WordPattern::GroupElement &element,
00041                                  const LingDef::Pos *&posDef) {
00042   xmlXPathContextPtr xpContext = xmlXPathNewContext(node->doc);
00043   xpContext->node = node;
00044 
00045   xmlXPathObjectPtr xpObj =
00046     xmlXPathEval((xmlChar *) "And|Or|Not|Pos|Feature|Form|Lemma",
00047                  xpContext);
00048   if (xpObj != NULL) {
00049     xmlNodeSetPtr nodeSet = xpObj->nodesetval;
00050     if (nodeSet != NULL) {
00051       {for (int i = 0; i < nodeSet->nodeNr; i++) {
00052         xmlNodePtr subNode = nodeSet->nodeTab[i];
00053         
00054         if (xmlStrcmp(subNode->name, (xmlChar *) "And") == 0) {
00055           go(subNode, element.createAnd(), posDef);
00056 
00057         } else if (xmlStrcmp(subNode->name, (xmlChar *) "Or") == 0) {
00058           go(subNode, element.createOr(), posDef);
00059 
00060         } else if (xmlStrcmp(subNode->name, (xmlChar *) "Not") == 0) {
00061           WordPattern::GroupElement &notElement = element.createAnd();
00062           notElement.setNegative();
00063           go(subNode, notElement, posDef);
00064 
00065         } else if (xmlStrcmp(subNode->name, (xmlChar *) "Pos") == 0) {
00066           xmlChar *tmp = xmlGetProp(subNode, (xmlChar *) "name");
00067           if (tmp != NULL) {
00068             const LingDef::Pos *pos = getLingDef().getPos((char *) tmp);
00069             if (pos == NULL) {
00070               cerr << "Feature '" << (char *) tmp << "' not defined" << endl;
00071             } else {
00072               posDef = pos;
00073               element.createLeaf().setPosDef(*pos);
00074             }
00075             xmlFree(tmp);
00076           }
00077 
00078         } else if (xmlStrcmp(subNode->name, (xmlChar *) "Feature") == 0) {
00079           if (posDef == NULL) {
00080             cerr << "Must have a pos before feature" << endl;
00081           } else {
00082             xmlChar *tmp = xmlGetProp(subNode, (xmlChar *) "name");
00083             if (tmp != NULL) {
00084               const LingDef::Feature *feature =
00085                 posDef->getFeature((char *) tmp);
00086               if (feature == NULL) {
00087                 cerr << "Feature '" << (char *) tmp << "' not defined" << endl;
00088               } else {
00089                 element.createLeaf().setFeature(*feature);
00090               }
00091               xmlFree(tmp);
00092             }
00093           }
00094 
00095         } else if (xmlStrcmp(subNode->name, (xmlChar *) "Form") == 0) {
00096           xmlChar *tmp = xmlNodeGetContent(subNode);
00097           if (tmp != NULL) {
00098             element.createLeaf().setForm((char *) tmp);
00099             xmlFree(tmp);
00100           }
00101 
00102         } else if (xmlStrcmp(subNode->name, (xmlChar *) "Lemma") == 0) {
00103           xmlChar *tmp = xmlNodeGetContent(subNode);
00104           if (tmp != NULL) {
00105             element.createLeaf().setLemma((char *) tmp);
00106             xmlFree(tmp);
00107           }
00108         }
00109 
00110       }}
00111     }
00112     xmlXPathFreeObject(xpObj);
00113   }
00114 
00115   xmlXPathFreeContext(xpContext);
00116 
00117   return true;
00118 }

Generated on Fri Jun 23 14:03:15 2006 for LinguisticDefinition by  doxygen 1.4.7