Имея действительный XML-документ, загруженный в DOMDocument xerces, как я могу найти узел XML и обновить значение? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть весь код, написанный и работающий для чтения в большом 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);

}
...