使用C++从xml文件中读取一行

tec*_*ner 2 c++ xml

我的XML文件有:

<Package> xmlMetadata </ Package>

我正在此文件中搜索标签,并且必须在控制台上打印此标签的开始和结束标签之间的文本.即在这种情况下,我希望在控制台上打印xmlMetadata.同样,它应该在文件中更进一步,如果它遇到同一文件中的另一个<Package>标记,则再次打印.

这是我的代码,但它是打印整个文件的内容:

{
    string line="< Package >";
    ifstream myfile (xmlFileName); //xmlFileName is xml file in which search is to done
    if (myfile.is_open())
    {
    while ( myfile.good() )
    {
      getline (myfile,line);
      std::cout<<line<< endl;
    }
    myfile.close();
    }
    else cout << "Unable to open file"; 
}
Run Code Online (Sandbox Code Playgroud)

在我的整个xml下面显示:

< ? xml version="1.0" ? >
< fileStructure >
< Main_Package >
   File_Navigate
< /Main_Package >
< Dependency_Details >

< Dependency >
   < Package >
      xmlMetadata
   < /Package >
   < Header >
      xmlMetadata.h
   < /Header >
   < Header_path >
      C:\Dependency\xmlMetadata\xmlMetadata.h
   < /Header_path >
   < Implementation >
      xmlMetadata.cpp
   < /Implementation >
   < Implementation_path >
      C:\Dependency\xmlMetadata\xmlMetadata.cpp
   < /Implementation_path >
< /Dependency >

< Dependency >
   < Package >
      xmlMetadata1
   < /Package >
   < Header >
      xmlMetadata1.h
   < /Header >
   < Header_path >
      C:\Dependency\xmlMetadata\xmlMetadata1.h
   < /Header_path >
   < Implementation >
      xmlMetadata1.cpp
   < /Implementation >
   < Implementation_path >
      C:\Dependency\xmlMetadata\xmlMetadata1.cpp
   < /Implementation_path >
< /Dependency >

< /Dependency_Details >
< /fileStructure >
Run Code Online (Sandbox Code Playgroud)

Mar*_*ett 6

Getline不会搜索它只是将每一行读入变量"line"的行,然后你必须在该"行"中搜索你想要的文本.

   size_t found=line.find("Package");
   if (found!=std::string::npos) {
       cout << line;
Run Code Online (Sandbox Code Playgroud)

但这是一种处理XML的坏方法 - 没有什么能阻止XML编写器将标记分成多行.除非这是一次性的并且您创建文件,否则您应该使用通用XML解析器来读取文件并为您提供标记列表.

有许多非常容易使用的XML解析器,例如TinyXML

编辑(现在发布了不同的xml) - 这是使用正则表达式解析xml的问题,你不知道xml如何打破行.在编写自己的xml解析器之前,您可以继续添加越来越多的复杂层 - 只需使用什么是C++的最佳开放XML解析器?