У меня есть раздел CDATA с проблемой, используя синтаксический анализатор Xerces. Ему удается проанализировать некоторые из XML правильно, но по какой -то причине часть раздела CDATA содержит проводной знак. < /P>
Это моя строка XML: < /p>
const std::string XML = R"(
AAAAccf123]]>
data]]>
)";
< /code>
Вот как настроен мой анализатор: < /p>
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);
return text1;
}
}
return "";
}
};
}
< /code>
Печать на консоли: < /p>
xmlx::XMLNode myXmlx;
myXmlx.parseXml(XML);
std::cout
Подробнее здесь: https://stackoverflow.com/questions/793 ... -correctly
Xerces parser cdata раздел не правильно проанализирован ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение