У меня есть раздел 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
Xerces parser cdata раздел не правильно проанализирован ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1738244824
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79398342/xerces-parser-cdata-section-not-parsed-correctly[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия