我正在尝试解析xml文件:

<?xml version="1.0"?>
<settings>
    <output>test.dat</output>
    <width>5</width>
    <depth>4</depth>
    <height>10</height>
</settings>

主要:

int _tmain(int argc, wchar_t* argv[])
{
    std::string SettingsFile = "settings.xml";
    rapidxml::xml_document<> doc;
    char* settings = FileHandler::readFileInChar(SettingsFile.c_str());

    std::cout << strlen(settings); // Output 1
    doc.parse<0 | rapidxml::parse_no_data_nodes>(settings);
    std::cout << strlen(settings); // Output 2

    ....
}

输出1:129

输出2:31

辅助功能:

static char* readFileInChar(const char* p_pccFile) 
{
    char* cpBuffer;
    size_t sSize;

    std::ifstream ifFileToRead;
    ifFileToRead.open(p_pccFile, std::ios::binary);

    if(ifFileToRead.is_open()) {
        sSize = getFileLength(&ifFileToRead);

        cpBuffer = new char[sSize+1];
        ifFileToRead.read(cpBuffer, sSize);
        ifFileToRead.close();
    }

    cpBuffer[sSize] = '\0';

    return cpBuffer;
}

static size_t getFileLength(std::ifstream* file) 
{
    file->seekg(0, std::ios::end);
    size_t length = file->tellg();
    file->seekg(0, std::ios::beg);

    return length;
}

当我尝试访问任何节点时,这会导致异常。 我想我这里缺少明显的东西,但到目前为止我还不明白。

如果我尝试以下操作:

std::cout << doc.first_node("output")->value();

我收到一条消息,指出读取位置0x00000004时发生访问冲突。

#1楼 票数:0 已采纳

该文档没有名称为“输出”的节点。 该文档有一个名为“设置”的节点,而该节点又有一个名为“输出”的节点。 以下代码

  std::ifstream file("settings.xml");
  std::vector<char> content = std::vector<char>(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
  content.push_back('\0');

  rapidxml::xml_document<> doc;
  doc.parse<0 | rapidxml::parse_no_data_nodes>(&content[0]);

  rapidxml::xml_node<> * root = doc.first_node();
  for (rapidxml::xml_node<> * node = root->first_node(); node; node = node->next_sibling())
  {
    std::cout << "value of <" << node->name() << "> is " << node->value() << std::endl;
  }

版画

value of <output> is test.dat
value of <width> is 5
value of <depth> is 4
value of <height> is 10

在我的机器上。

编辑:如果您在调试器中查看“内容”,则可以清楚地看到Rapidxml在其中插入“ \\ 0”的位置。

  ask by translate from so

未解决问题?本站智能推荐:

1回复

RapidXML异常

我正在尝试解析另一个XML系统的响应。 我决定使用RapidXML作为我的解析器。 在系统报告“faultResponse”消息之前,一切都很顺利。 当试图处理“faultResponse”消息时,我得到一个解析错误 我确定我正在捕获异常代码,它说这是一个解析错误。 “预期<
2回复

RapidXML引发异常

这是我为使用RapidXML进行XML解析而编写的代码,但是它引发了异常“ rapidxml :: parse_error在内存位置0x0011fc20 ..”。请为此提出任何解决方案。 谢谢
1回复

boost / rapidxml解析崩溃

我们将boost / rapidxml用于发布/订阅代理实现中的XML解析,并且对于某些XML有效负载,代理崩溃。 为了消除尽可能多的变量,我实现了一个简短的测试程序,该程序仅执行XML解析,并且崩溃类似。 我的简短测试程序位于: 示例输入XML在这里: http : //p
1回复

使用RapidXML解析

我有一个XML文件,应该使用RapidXML和c ++进行解析。 该文件是系统树。 每个节点都有一个带有1-3个子节点的节点,每个子节点都有值。 节点可以是科学名称,通用名称或等级。 我的问题是,由于每个分类节点的子节点各不相同(例如,一个节点可能既有科学名称又有通用名称,而一个可能只有
4回复

如何使用RapidXml解析XML文件

我必须用C ++解析XML文件。 我正在研究并找到了RapidXml库。 我对doc.parse<0>(xml)有疑问。 xml可以是.xml文件还是需要是string或char * ? 如果我只能使用string或char *那么我想我需要读取整个文件并将其存储
1回复

RapidXML节点异常处理

我正在使用RapidXML解析一个xml文件,其中包含一些我想在我的C ++程序中使用的变量。 我能够读取有效的节点,但是例如,如果节点名称拼写错误,我想添加一些错误处理。 这是我的文件的工作示例。 的.cpp .XML 但是,如果我将.cpp文件中的first_n
1回复

Rapidxml仅解析一个完整的节点

我正在使用RapidXML解析xml字符串。 有我的字符串: 这是我尝试解析的方法: 但是,我得到的是,它只像一个节点一样被解析: protocol ,即兄弟姐妹,protocol的子代为null,而根本没有。 我想我缺少一件事。 你能找到并告诉我吗? 谢谢。
1回复

使用脚本调用时,RapidXML不会解析

我正在使用iNotify监视文件夹。 在文件夹中创建文件后,观察者将获取文件,将其重命名(使用mv),然后将其移动到另一个文件夹。 然后,使用bash脚本调用RapidXML程序,并假定该程序解析文件的XML内容。 RapidXML程序脚本调用后,iNotify程序也会重新启动。 因