Я избалован (конечно, гнилой) C# и его классами обработки XML в пространстве имен System.Xml
. Я могу загрузить файл XML в файл XmlDocument
. Я могу искать по всему документу узлы, соответствующие выражению XPath, используя XmlNode.SelectNodes( "an xpath expression" )
. Результатом является XmlNodeList
, который содержит XmlNode
объектов, которые я могу перебирать.
Сейчас я использую C++ Qt (версии 4.7.1 и 4.8, но конкретная версия может быть не важна). Я могу загрузить файл XML в файл QDomDocument
. Но я разочарован тем, что не могу искать документ с помощью выражения XPath так же, как я делал это в C#.
Я имел ограниченный успех, используя QXmlQuery
для поиска материала в файле XML. Если я правильно напишу запрос, я смогу получить QStringList
результатов, повторить эти QStringList
, а затем сохранить данные где-нибудь для последующего использования.
Но я все еще хочу иметь возможность получить коллекцию QDomNode
объектов, которые находятся в документе, напрямую через выражение XPath. Один конкретный вариант использования — найти один элемент, чей атрибут «имя» имеет определенное значение, а затем заменить этот элемент новым элементом. Вот почему мне нужен сам объект QDomNode
, а не просто какое-то строковое или другое представление содержимого XML, которое может предоставить QXmlQuery
. Для только что упомянутого конкретного варианта использования я использую QDomElement.elementsByTagName()
и итерирую эти элементы, но это не так гибко и не так круто, как XPath.
Это просто желаемое за действительное? Стоит ли разрабатывать новый класс, реализующий интерфейс QAbstractXmlReceiver
? Или я просто получу новую коллекцию данных, которая не имеет прямого отношения к объектам QDomNode
в QDomDocument
?
QAbstractXmlNodeModel
. Вы можете найти его по адресу adared.ch/qdomnodemodel-qxmlquery. - person Alejandro   schedule 09.05.2019QDomNodeModel
доступен по этой ссылке в сочетании с примером использованияQXmlQuery
по адресу qtcentre.org/threads/ достаточно развит, чтобы работать у меня как есть. - person Mike Finch   schedule 10.05.2019