我的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)
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解析器?