Разбор XML с использованием libxml - PullRequest
0 голосов
/ 18 февраля 2010

У меня небольшая проблема с анализом XML. Я не могу получить имя дочернего узла.

Вот мой XML-код:

<?xml version="1.1" encoding='UTF-8'?>
<SceneObject>
<ParticleSystem>
</ParticleSystem>
</SceneObject>

Вот как я анализирую XML-файл:

SceneObject::SceneObject(const char *_loadFromXMLFile, const char *_childType)
{
 xmlNodePtr cur;

 pXMLDocument = xmlParseFile( getPathForResource(_loadFromXMLFile, "xml") );

 if (pXMLDocument == NULL)
 {
  fprintf(stderr, "Document not parsed successfully. \n");
  return;
 }

 cur = xmlDocGetRootElement(pXMLDocument);

 if (cur == NULL) {
  fprintf(stderr, "Empty document\n");
  xmlFreeDoc(pXMLDocument);
  return;
 }


 if (!xmlStrEqual(cur->name, (const xmlChar *) "SceneObject"))
 {
  fprintf(stderr, "Document of the wrong type; root node == %s\n", cur->name);
  xmlFreeDoc(pXMLDocument);
  return;
 }

 SimpleLog("cur->name: %s", (const char*)cur->name);
 cur = cur->children;
 SimpleLog("cur->children->name: %s", (const char*)cur->name);
}

Что я получаю в консоли:

cur->name: SceneObject
cur->children->name: text

Почему "cur-> children-> name" является "text" и не является "ParticleSystem"?

Что я делаю не так и как я могу это исправить?

Спасибо.

1 Ответ

4 голосов
/ 18 февраля 2010

Узел "text" - это пробел (символ новой строки) между <SceneObject> и <ParticleSystem> в вашем документе. cur->children->next - это узел <ParticleSystem>, который вы хотите в этом случае.

Как правило, вы можете обратиться к type члену узла, чтобы определить, является ли он элементом, текстом, cdata и т. Д.

...