3

我知道那里有几个 XML 库,但不幸的是,我无法将它们用于我正在从事的学校项目。

我有一个创建这个 XML 文件的程序。

<theKey>
<theValue>23432</theValue>
</theKey>

我要做的是解析标签之间的“23432”。但是,文件中有随机标签,因此可能并不总是在从顶部开始的第二行。另外,我不知道标签之间的数字是多少位数。

这是我到目前为止开发的代码。它是基本的,因为我不知道我可以使用 C++ 语言中的什么来解析值。我使用 JAVA 的提示是使用“String”库中的一些东西,但到目前为止,我还没有找到可以使用的东西。

任何人都可以给我方向或线索我可以做什么/使用吗?非常感谢。

这是我到目前为止开发的代码:

#include <iostream>
#include <fstream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::fstream;
using std::string;
using std::ifstream;


int main()
{
 ifstream inFile;
 inFile.open("theXML.xml");

 if (!inFile)
 {
 }

 string x;
 while (inFile >> x)
 {
  cout << x << endl;
 }

 inFile.close();

 system ( "PAUSE" );


 return 0;
}
4

4 回答 4

7

要解析任意 XML,您确实需要一个合适的 XML 解析器。当您包含该语言的所有字符模型角落和与 DTD 相关的缝隙时,解析一点也不简单,编写一个只理解 XML 的任意子集的解析器是一个可怕的失礼。

在现实世界中,不使用适当的 XML 解析器库来实现这一点是错误的。如果您不能使用库并且不能将程序的输出格式更改为更容易解析的格式(例如,换行符分隔的键/值对),那么您将处于站不住脚的位置。任何要求您在没有 XML 解析器的情况下解析 XML 的学校项目都是完全错误的。

(好吧,除非项目的全部目的是用 C++ 编写 XML 解析器。但这将是一项非常残酷的任务。)

于 2010-02-08T23:24:10.113 回答
4

这是您的代码应该是什么样子的大纲(我省略了繁琐的部分作为练习):

std::string whole_file;

// TODO:  read your whole XML file into "whole_file"

std::size_t found = whole_file.find("<theValue>");

// TODO: ensure that the opening tag was actually found ...

std::string aux = whole_file.substr(found);
found = aux.find(">");

// TODO: ensure that the closing angle bracket was actually found ...

aux = aux.substr(found + 1);

std::size_t end_found = aux.find("</theValue>");

// TODO: ensure that the closing tag was actually found ...

std::string num_as_str = aux.substr(0, end_found); // "23432"

int the_num;

// TODO: convert "num_as_str" to int

当然,这不是一个合适的 XML 解析器,它只是一个快速而肮脏的东西,可以解决您的问题。

于 2010-02-08T23:47:20.037 回答
2

You will need to create functions to at least:

  • If the node is a container node then
    • Identify/parse elements (beginings and ends) and attributes, if any
    • Parse children recursively
  • Otherwise, extract the value while trimming trailing and leading whitespaces, if any, if they are not significant

The std::string provides quite a few useful member functions such as: find, find_first_of, substr etc. Try to use these in your functions.

于 2010-02-08T23:03:33.760 回答
2

THe C++ Standard library provides no XML parsing features. If you want to write this on your own, I suggest looking at std::geline() to read your data into strings (don't try to use operator>> for this), and then at the std::string class's basic features like the substr() function to chop it up. But be warned that writing your own XML parser, even a basic one, is very far from trivial.

于 2010-02-08T23:04:04.820 回答