2014-09-16 4 views
0

В моем текущем проекте мне нужно изменить несколько документов XML, используя tinyXML.Есть что-то вроде GetTextNode в TinyXml?

Я не нашел функцию SetText (const char *). Я знаю, что вместо этого вы должны создать TiXmlText и связать его с элементом:

TiXmlElement* pParent = ...; 
TiXmlText* pText = new TiXmlText(szText); 
pParent->LinkEndChild(pText); 

Однако, если узел уже имеет текстовый ребенок, по моему пониманию, я должен изменить свое значение вместо этого.

я также не нашел что-то вроде FirstChildText() или GetTextNode() и т.д. Я думаю, используя эту строку

TiXmlText* pText = pParent->FirstChild()->ToText(); 

вызовет проблемы, если pParent уже есть другие дети, чем текст (в моем случае атрибут, комментарий - я могу игнорировать элементы/смешанный режим), поэтому я оказался в итерации по всем дочерним элементам, проверяя их тип() как TINYXML_TEXT.

Есть ли лучший способ сделать это или, может быть, существующий набор вспомогательных функций (включая setText), который я еще не нашел?

ответ

0

SetText() поддерживается в TinyXML-2, но не TinyXML-1. Он не имеет «интеллекта» и предполагает, что FirstChild является текстовым узлом. Если вы знаете, что не существует дочерний узел, или только дочерний текстовый узел, то почти эквивалентно SetText() является:

if (pParent->FirstChild()) { 
    pParent->RemoveChild(pParent->FirstChild()); 
} 
pParent->LinkEndChild(new TiXmlText("foo")); 

Если вы выборочно заменить текст, например, пропуск комментарий Вы упоминаете, то вам придется перебирать. Для этого нет встроенных функций. Но вы можете изменить текст, когда найдете его. Вам не нужно создавать новый текстовый узел для изменения текста:

pText->SetValue("this is my new text");