У меня есть весь код, написанный и работающий для чтения в большом XML-документе с использованием xerces-c, и DOMDocument является действительным и правильным. Файл представляет собой большой набор параметров конфигурации для устройства, которым управляет программа. Я успешно получаю значение конфигурации из XML и показываю его пользователю. Пользователь обновляет значение, и мне нужно записать его обратно в исходный xml.
Путь xpath к узлу: / puregevconfiguration / device / device / parameter [@ name = 'Width']
Учитывая этот xpath, мне нужно найти правильный узел и записать значение, указанное пользователем.
Например, этот xpath возвращает 2048 в качестве ширины. Пользователь вводит 1024, и мне нужно написать 1024 для замены 2048.
У меня есть некоторый код из примера xerces-c DOMPrint. Он ищет по xpath и записывает выбранные узлы в указанный вывод. Вместо записи выбранных узлов в выходные данные, мне нужно обновить узлы. Как только это будет сделано, я напишу весь xml в исходный файл.
Пример xml:
<puregevconfiguration>
<device>
<device version="1.0">
<parameter name="Width">2048</parameter>
</device>
<device>
</puregevconfiguration>
void DeviceConfig::UpdateConfigValueXDom(QByteArray &xPath, QString &newValue) {
XMLCh* xpathStr=XMLString::transcode(xPath);
// doc is a property of the object that has been loaded correctly
DOMElement* root = doc->getDocumentElement();
try
{
DOMXPathNSResolver* resolver=doc->createNSResolver(root);
DOMXPathResult* result=doc->evaluate(
xpathStr,
root,
resolver,
DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE,
NULL);
XMLSize_t nLength = result->getSnapshotLength();
for(XMLSize_t i = 0; i < nLength; i++)
{
result->snapshotItem(i);
// instead of serializing the node to a file,
// I need to update the value of the node.
}
result->release();
resolver->release ();
}
catch(const DOMXPathException& e)
{
XERCES_STD_QUALIFIER cerr << "An error occurred during processing of the XPath expression. Msg is:"
<< XERCES_STD_QUALIFIER endl
<< StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl;
retval = 4;
}
catch(const DOMException& e)
{
XERCES_STD_QUALIFIER cerr << "An error occurred during processing of the XPath expression. Msg is:"
<< XERCES_STD_QUALIFIER endl
<< StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl;
retval = 4;
}
XMLString::release(&xpathStr);
}