Есть ли что-то вроде GetTextNode в TinyXml?

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

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

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

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

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

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

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

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


person Chris    schedule 16.09.2014    source источник


Ответы (1)


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");
person grinliz    schedule 17.09.2014