Xerces C++ - 加载、读取和保存,替代方案?

2023-12-27

我正在寻找一个教程来加载 XML 文件、读取它、更改它并最终使用 C++ 保存它。我正在使用 Linux Ubuntu 并尝试使用 Xerces。通过 Google 和很多时间,我只能加载一个 XML 文件:

#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>

#include <iostream>

using namespace std;
using namespace xercesc;

int main (int argc, char* args[]) {

    try {
        XMLPlatformUtils::Initialize();
    }
    catch (const XMLException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Error during initialization! :\n"
             << message << "\n";
        XMLString::release(&message);
        return 1;
    }

    XercesDOMParser* parser = new XercesDOMParser();
    parser->setValidationScheme(XercesDOMParser::Val_Always);
    parser->setDoNamespaces(true);    // optional

    ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
    parser->setErrorHandler(errHandler);

    const char* xmlFile = "demo.xml";

    try {
        parser->parse(xmlFile);
    }
    catch (const XMLException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return -1;
    }
    catch (const DOMException& toCatch) {
        char* message = XMLString::transcode(toCatch.msg);
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return -1;
    }
    catch (...) {
        cout << "Unexpected Exception \n" ;
        return -1;
    }

    DOMNode* docRootNode;
//  DOMNode* aNode;
    DOMDocument* doc;
    doc = parser->getDocument();
    docRootNode = doc->getDocumentElement();
    cout << docRootNode->getAttributes() << endl; //returns Hex



    delete parser;
    delete errHandler;
    return 0;
}

如何读取和操作 XML 文件并最终保存它?有替代库吗? (我尝试过tinyxml,但当我想编译它时,文件返回错误)


保存 xerces DOMDocument 的示例。保存文档

DOMLSSerializer::write(const DOMNode* nodeToWrite, DOMLSOutput* const destination)

参见代码示例http://xerces.apache.org/xerces-c/domprint-2.html http://xerces.apache.org/xerces-c/domprint-2.html

    DOMLSSerializer * theSerializer = impl->createLSSerializer();
    DOMPrintFilter   *myFilter = new DOMPrintFilter(DOMNodeFilter::SHOW_ELEMENT   |
                                      DOMNodeFilter::SHOW_ATTRIBUTE |
                                      DOMNodeFilter::SHOW_DOCUMENT_TYPE);
    theSerializer->setFilter(myFilter);

    DOMLSOutput       *theOutputDesc = ((DOMImplementationLS*)impl)->createLSOutput();
    XMLFormatTarget *myFormTarget  = new LocalFileFormatTarget(XMLString::transcode("C:\\target.xml"));
    theOutputDesc->setByteStream(myFormTarget);
    theOutputDesc->setEncoding(XMLString::transcode("ISO-8859-1"));

    theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMXMLDeclaration, true);

    theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true);
    theSerializer->write(doc, theOutputDesc);

    myFormTarget->flush();

    delete myFormTarget;

    theOutputDesc->release();
    theSerializer->release();

以及过滤器实现的示例。您可以在 DOMPrint 示例中找到它。

class DOMPrintFilter : public DOMLSSerializerFilter {
public:

    DOMPrintFilter(ShowType whatToShow = DOMNodeFilter::SHOW_ALL);
    ~DOMPrintFilter(){};

    virtual FilterAction acceptNode(const DOMNode*) const;
    virtual ShowType getWhatToShow() const {return fWhatToShow;};

private:
    // unimplemented copy ctor and assignement operator
    DOMPrintFilter(const DOMPrintFilter&);
    DOMPrintFilter & operator = (const DOMPrintFilter&);

    ShowType fWhatToShow;
};
#include "DOMPrintFilter.hpp"
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/XMLString.hpp>

static const XMLCh  element_person[]=
{
chLatin_p, chLatin_e, chLatin_r, chLatin_s, chLatin_o, chLatin_n, chNull
};

static const XMLCh  element_link[]=
{
chLatin_l, chLatin_i, chLatin_n, chLatin_k, chNull
};

DOMPrintFilter::DOMPrintFilter(ShowType whatToShow)
:fWhatToShow(whatToShow)
{}

DOMNodeFilter::FilterAction DOMPrintFilter::
acceptNode(const DOMNode* node) const
{
//
// The DOMLSSerializer shall call getWhatToShow() before calling
// acceptNode(), to show nodes which are supposed to be
// shown to this filter.
//
// REVISIT: In case the DOMLSSerializer does not follow the protocol,
//          Shall the filter honour, or NOT, what it claims
//          it is interested in ?
//
// The DOMLS specs does not specify that acceptNode() shall do
// this way, or not, so it is up the implementation,
// to skip the code below for the sake of performance ...
//
if ((getWhatToShow() & (1 << (node->getNodeType() - 1))) == 0)
    return DOMNodeFilter::FILTER_ACCEPT;

switch (node->getNodeType())
{
case DOMNode::ELEMENT_NODE:
    {
        // for element whose name is "person", skip it
        if (XMLString::compareString(node->getNodeName(),          element_person)==0)
            return DOMNodeFilter::FILTER_SKIP;
        // for element whose name is "line", reject it
        if (XMLString::compareString(node->getNodeName(), element_link)==0)
            return DOMNodeFilter::FILTER_REJECT;
        // for rest, accept it
        return DOMNodeFilter::FILTER_ACCEPT;

        break;
    }
case DOMNode::COMMENT_NODE:
    {
        // the WhatToShow will make this no effect
        return DOMNodeFilter::FILTER_REJECT;
        break;
    }
case DOMNode::TEXT_NODE:
    {
        // the WhatToShow will make this no effect
        return DOMNodeFilter::FILTER_REJECT;
        break;
    }
case DOMNode::DOCUMENT_TYPE_NODE:
    {
        // even we say we are going to process document type,
        // we are not able be to see this node since
        // DOMLSSerializerImpl (a XercesC's default implementation
        // of DOMLSSerializer) will not pass DocumentType node to
        // this filter.
        //
        return DOMNodeFilter::FILTER_REJECT;  // no effect
        break;
    }
case DOMNode::DOCUMENT_NODE:
    {
        // same as DOCUMENT_NODE
        return DOMNodeFilter::FILTER_REJECT;  // no effect
        break;
    }
default :
    {
        return DOMNodeFilter::FILTER_ACCEPT;
        break;
    }
}

return DOMNodeFilter::FILTER_ACCEPT;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xerces C++ - 加载、读取和保存,替代方案? 的相关文章

随机推荐

  • PHP - 将 数据作为包含加载是愚蠢的吗

    这可能是一个非常愚蠢的问题 但是加载文件中标签之间的数据并通过 PHP include 加载它是愚蠢的吗 这样可以更轻松地进行编辑 谢谢 不 这不会是愚蠢的 重复代码越少越好
  • HTML 链接尾部斜杠[重复]

    这个问题在这里已经有答案了 The w3学校 http www w3schools com html html links asp文档说 如果子文件夹地址末尾没有斜杠 您可能会向服务器生成两个请求 许多服务器会自动在地址中添加尾部斜杠 然后
  • 在设计数据库时,存储多个真/假值的首选方式是什么?

    如标题中所述 在设计数据库时 处理具有多个列的表的首选方法是什么 这些列仅将真 假值存储为单个或值 例如 Y N 或 0 1 同样 不同数据库 例如 Oracle 和 SQL Server 之间是否可能出现一些问题 这些问题可能会影响列的处
  • R中二项式数据的置信区间?

    我知道我需要 Mean 和 s d 来找到间隔 但是 如果问题是 对随机抽取的 1 000 名工人进行的调查显示 其中 520 名是女性 根据调查为女性工人比例创建 95 的置信区间 我如何找到平均值和标准差 您还可以使用prop test
  • Spring MVC 控制器方法什么时候应该有@ResponseBody?

    我用 ResponseBody使用我的 Spring 控制器进行注释 但我不确定何时使用它 另外 我将我的方法命名为index我想知道这是否重要 我的方法头是 RequestMapping value addproduct method R
  • Ansible 中根据特定值对 dict 进行排序

    我在 Ansible 中将以下字典设置为变量 my users name1 value some value1 id 99 type some type1 name2 value some value2 id 55 type some ty
  • WPF 窗口未关闭

    您能告诉初学者为什么这个小型 WPF 应用程序在 WorkflowTermulated 事件触发后没有按预期关闭吗 使用的工作流程立即终止 使用 WPF 应用程序 Net Framework 3 5 public partial class
  • 在 UITabBar 顶部查看

    Similar to what the Spotify or Apple Music app does when a song is playing it places a custom view on top of the UITabBa
  • 如何使用 Xcode Storyboards 创建 Popover

    如何在 iPad Storyboard 中为 iOS 5 0 应用程序创建弹出框 Xcode 项目模板 实用程序应用程序 已经有了一个设置 但我似乎不明白 Apple 是如何让它工作的 我试图模仿它 但只出现错误 我什至查看了苹果的开发网站
  • 通过 Xaml 将代码隐藏中定义的依赖属性绑定到 UserControl 的 DataContext 中的属性

    我想使用与找到的代码类似的代码here https stackoverflow com questions 2404080 expose usercontrol property to xaml我遇到的问题是我想扩展它以允许使用 XAML
  • Spring Boot上传BootRepackage可执行Jar

    我正在使用 Spring Boot 来开发我的新项目 在我的 build gradle 文件中 我使用 bootRepackage classifier 因此我可以单独生成项目的默认 jar 和使用 Spring Boot 生成的可执行 j
  • 如何处理内存中的Excel文件?

    我正在尝试创建一个 API 它将接受来自客户端的 Excel 文件的表示形式 我希望在处理第一个工作表后返回一个 List gt 作为 JSON 数组 但是 我无法将文件写入磁盘 并且所有处理must happen 在记忆中 有哪些方法可以
  • 确定 connect-msolservice 是否已成功调用

    我正在 PowerShell 中编写 Office 365 辅助工具 并且有一个我认为是简单的问题但找不到答案 我如何判断连接是否由Connect MsolService是否存在且活跃 必须有某种方法可以知道 因为其他 cmdlet 可以检
  • 使用 AWS CLI 通过标签终止 EC2 实例上的一组

    对 AWS 不太熟悉 但是我希望通过按标签名称进行过滤来使用 AWS CLI 终止一组 ec2 实例 如果我使用describe instances I can filter按标签 键 value For terminate instanc
  • 尽管已安装但未找到 Python 模块

    我试图告诉 pandoc 使用用 python 编写的自定义 pandocfilter 我使用的是 MacBook M1 因此安装了 2 7 和自制的 3 9 7 版本的 python 由于某种原因 尽管已正确安装 但未找到 pandocf
  • 匹配一个“.”在java中[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有下面的
  • 我可以在 Android 设备上存储数据以在安装之间保留吗?

    我想以在应用程序安装之间保留少量数据的方式存储少量数据 我显然无法使用 SharedPreferences 因为它们在卸载时会被删除 有没有什么方法可以存储数据 以便在重新安装应用程序后数据仍然存在 我想要存储的数据是一个唯一的 ID 以便
  • PHP 安全性:将 POST 发送到相同的 URL = 不好?

    昨天我收到了有关将 POST 数据发送到同一页面的问题的回复重定向后获取模式 http en wikipedia org wiki Post Redirect Get像这样 if isset POST Submit prevent rese
  • WPF 窗口背景 ImageBrush 不平铺

    我有一个带有背景图像的窗口 图像可能会在运行时发生变化 这对此并不重要 我希望图像固定在左上角 确实如此 而不是缩放 这也是正确的 但是当窗口大于图像时 我需要重复 平铺 图像 我正在做 我缺少什么 TIA 您需要设置TileMode ht
  • Xerces C++ - 加载、读取和保存,替代方案?

    我正在寻找一个教程来加载 XML 文件 读取它 更改它并最终使用 C 保存它 我正在使用 Linux Ubuntu 并尝试使用 Xerces 通过 Google 和很多时间 我只能加载一个 XML 文件 include