Xerces parser cdata раздел не правильно проанализированC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Xerces parser cdata раздел не правильно проанализирован

Сообщение Anonymous »

У меня есть раздел CDATA с проблемой, используя синтаксический анализатор Xerces. Ему удается проанализировать некоторые из XML правильно, но по какой -то причине часть раздела CDATA содержит проводной знак. < /P>
Это моя строка XML: < /p>
const std::string XML = R"(



AAAAccf123]]>
data]]>


)";
< /code>
Вот как настроен мой анализатор: < /p>

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include
#include
#include

namespace xmlx
{
class XMLNode
{
private:
xercesc::DOMElement* _element;
bool _first_in_loop;

public:
XMLNode() : _element(nullptr), _first_in_loop(true)
{
}

XMLNode(xercesc::DOMElement* element) : _element(element), _first_in_loop(true) {}

~XMLNode()
{
}

xercesc::DOMDocument* parseXml(const std::string& XML = "")
{
xercesc::MemBufInputSource memBuf(reinterpret_cast(XML.c_str()), XML.size(), "xmlBuffer", false);

xercesc::XercesDOMParser* parser = new xercesc::XercesDOMParser();
parser->setValidationScheme(xercesc::XercesDOMParser::Val_Never);
parser->setDoNamespaces(false);
parser->setDoSchema(false);
parser->setLoadExternalDTD(false);

xercesc::DOMDocument* doc;
try
{
parser->parse(memBuf);
doc = parser->getDocument();
delete parser;
}
catch (...)
{
std::cerr getFirstChild(); child != nullptr; child = child->getNextSibling())
{
if (child->getNodeType() == xercesc::DOMNode::ELEMENT_NODE)
{

xercesc::DOMElement* currentElement = dynamic_cast(child);
std::string myStr = xercesc::XMLString::transcode(currentElement->getTagName());
if (myStr == tagName)
{
return XMLNode(currentElement);
}
}
}
std::string error = "No next element found";
throw(std::runtime_error(error));
}

std::string getText()
{
if (_element == nullptr) return "";

for (DOMNode* child = _element->getFirstChild(); child != nullptr; child = child->getNextSibling())
{
if (child->getNodeType() == xercesc::DOMNode::TEXT_NODE)
{
xercesc::DOMText* tempText = dynamic_cast(child);
if (tempText == nullptr)
{
return "";
}
char* textContent = xercesc::XMLString::transcode(tempText->getData());
std::string text(textContent);
xercesc::XMLString::release(&textContent);
return text;
}
if (child->getNodeType() == xercesc::DOMNode::CDATA_SECTION_NODE)
{
xercesc::DOMCDATASection* tempCdata1 = dynamic_cast(child);
if (tempCdata1 == nullptr)
{
return "";
}
char* textContent1 = xercesc::XMLString::transcode(tempCdata1->getData());
std::string text1(textContent1);
xercesc::XMLString::release(&textContent1);
return text1;
}
}
return "";
}
};
}
< /code>
Печать на консоли: < /p>
xercesc::XMLPlatformUtils::Initialize();

xmlx::XMLNode myXmlx;
myXmlx.parseXml(XML);
std::cout

Подробнее здесь: https://stackoverflow.com/questions/793 ... -correctly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»