求 C++读写取XML 文件方法!网上复制的让开

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求 C++读写取XML 文件方法!网上复制的让开相关的知识,希望对你有一定的参考价值。

下面是我写的生成XML文件的例子,主要是用递归来完成嵌套的XML生成。
生成的格式为:
<Datas>
<Data>
<year>
</year>
<paper>
<name> </name>
<number></number>
<weight></weight>
<paper>
</paper>
.....
</paper>
</Data>
...
</Datas>
#include <fstream>
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MAX_YEAR = 6;
const int MAX_NODENAME = 8;
const int MAX_DEPTH = 1;
const int MAX_ITEM = 15;
const int MAX_TAGS = 50;

enum NodeName

DATAS,
DATA,
YEAR,
PAPERS,
NUMBER,
WEIGHT,
TAG,
NAME
;

string NodeBegin[MAX_NODENAME] = "<Datas>", "<Data>", "<year>", "<paper>", "<number>", "<weight>", "<tag>", "<name>";
string NodeEnd[MAX_NODENAME] = "</Datas>", "</Data>", "</year>", "</paper>", "</number>", "</weight>", "</tag>", "</name>";
string Years[MAX_YEAR] = "2000","2001","2002","2003","2004","2005";

//_T的意思是通知编译器,自行进行字符串的多字节/Unicode转换。
//而L表示,该字符串为Unicode版本。
ofstream outfile(L"首页.xml");
int Random(int i)

return (rand()%i+1);


void Recursive(int level, string parentName, string year)

if (level == 1)

for (int i = 0; i < MAX_ITEM; i++)

outfile<<NodeBegin[PAPERS]<<endl;
outfile<<NodeBegin[NAME]<<parentName<<"-"<<i<<NodeEnd[NAME]<<endl;
outfile<<NodeBegin[NUMBER]<<Random(10)<<NodeEnd[NUMBER]<<endl;
outfile<<NodeBegin[WEIGHT]<<Random(10)<<NodeEnd[WEIGHT]<<endl;
outfile<<NodeEnd[PAPERS]<<endl;


for (int j =0; j < MAX_TAGS; j++)

outfile<<NodeBegin[TAG]<<endl;
outfile<<NodeBegin[NAME]<<year<<":"<<parentName<<"-"<<j<<NodeEnd[NAME]<<endl;
outfile<<NodeBegin[WEIGHT]<<Random(10)<<NodeEnd[WEIGHT]<<endl;
outfile<<NodeEnd[TAG]<<endl;


else

for (int i = 0; i < MAX_ITEM; i++)

char a[10];
string str;
itoa(i, a, 10);
str = a;
string curName = parentName+"-"+str;
outfile<<NodeBegin[PAPERS]<<endl;
outfile<<NodeBegin[NAME]<<curName<<NodeEnd[NAME]<<endl;
outfile<<NodeBegin[NUMBER]<<Random(10)<<NodeEnd[NUMBER]<<endl;
outfile<<NodeBegin[WEIGHT]<<Random(10)<<NodeEnd[WEIGHT]<<endl;
Recursive(level-1, curName, year);
outfile<<NodeEnd[PAPERS]<<endl;


for (int j =0; j < MAX_TAGS; j++)

outfile<<NodeBegin[TAG]<<endl;
outfile<<NodeBegin[NAME]<<"Tag"<<year<<":"<<parentName<<"-"<<j<<NodeEnd[NAME]<<endl;
outfile<<NodeBegin[WEIGHT]<<Random(10)<<NodeEnd[WEIGHT]<<endl;
outfile<<NodeEnd[TAG]<<endl;




void GenerateXML()

outfile<<NodeBegin[DATAS]<<endl;
for (int i = 0; i < MAX_YEAR; i++ )

outfile<<NodeBegin[DATA]<<endl;
outfile<<NodeBegin[YEAR]<<Years[i]<<NodeEnd[YEAR]<<endl;
Recursive(MAX_DEPTH, "学科主题",Years[i]);
outfile<<NodeEnd[DATA]<<endl;

outfile<<NodeEnd[DATAS]<<endl;

void main()

locale::global(locale(""));
srand(time(NULL));

if (!outfile)

cout<<"can't open output file"<<endl;


GenerateXML();
cout<<"Generate End."<<endl;
参考技术A //纯c的:
//创建新文档
xmlDocument xmlNewDocument()

xmlDocument xmlNew=xmlNewDoc(BAD_CAST"1.0");
xmlNew->encoding =(const xmlString)"utf-8";
return xmlNew;

//获取文档根节点
xmlSingleNode xmlSingleNodeDocRoot=xmlDocGetRootElement(Doc);
//设置根节点
xmlSingleNode xmlSetRootNode(xmlDocument Doc,xmlSingleNode xmlRootNode)
//创建节点
xmlSingleNode CreateElement(char* xmlElementText)

xmlSingleNode xmlNew=xmlNewNode(NULL,BAD_CAST+xmlElementText);
return xmlNew;

//添加孩子结点
xmlSingleNode xmlAddChild(xmlSingleNode ParentNode,xmlSingleNode xmlNewNode);
//获取节点属性值
char* xmlGetProp(xmlSingleNode xmlCurNode,(xmlString)xmlNodeAttrName);
//为某节点添加属性
XmlAttribute xmlNewProp(xmlSingleNode XmlCurNode,char* xmlElementAttributeName,char* xmlElementAttributeValue);
//设置节点属性
XmlAttribute xmlSetProp(xmlSingleNode XmlCurNode,char* xmlElementAttributeName,char* xmlElementAttributeValue);
//加载xml
xmlDocument xmlParseFile(char* xmlFilePath);
//保存一个xml文件
int Save(const char* filename,xmlDocument Doc);
//c#的:
xmlDoc = new XmlDocument();
xmlDoc.Load(@"F:\SegyML.xml");
x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素
x.appendChild(node) - 向 x 插入子节点
x.removeChild(node) - 从 x 删除子节点
txt=doc.nodeValue;获取元素的值
offset=xmlDoc.getElementsByTagName(“record")[0].getAttributeNode(“offset"); 获取元素属性值
createElement() 方法创建新的元素节点。
createTextNode() 方法创建新的文本节点。
appendChild() 方法向节点添加子节点(在最后一个子节点之后)。
下面的代码片段将删除第一个 <record> 元素中的第一个节点:
x=xmlDoc.getElementsByTagName(“record")[0];
x.removeChild(x.childNodes[0]);
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
xmlDoc.selectNodes(路径表达式) ;
xmlDoc.selectNodes("/bulkdata/record");
以上均为我常用的函数。即使在c++里,我也多喜欢用纯C的函数,把xmlDom里的有时候自己封装了一下就用了。
参考技术B 额。。。Linux 下 有 XML 封装,解析等操作的库, libxml-2.0 额。。里边的接口就可以实现XML文件的创建和读写等。。。你看看是不是满足你的要求, C++下估计也有相关的库可用。。。

呵呵。。。说的很模糊,祝你好运。。。如何你是要做Linux C /C++ 的话,我可以给你说几个例子。。。本回答被提问者采纳

C# 读写XML文件的方法

C# 读写XML文件的方法

一.写XML文件

     
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.AppendChild(xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", null));
XmlElement xmlRoot = xmlDocument.CreateElement("Root");
xmlDocument.AppendChild(xmlRoot);

XmlElement xmlChild = xmlDocument.CreateElement("Child1");
xmlRoot.AppendChild(xmlChild);

xmlChild = xmlDocument.CreateElement("Child2");
xmlChild.InnerText = "我是Child2的值呀";
xmlRoot.AppendChild(xmlChild);

xmlChild = xmlDocument.CreateElement("Child3");
XmlElement xmlElementInner = xmlDocument.CreateElement("Child3的XmlElementInner");
XmlAttribute xmlAttribute = xmlDocument.CreateAttribute("我是键");
xmlAttribute.Value = "我是值";
xmlElementInner.Attributes.SetNamedItem(xmlAttribute);
xmlChild.AppendChild(xmlElementInner);

xmlRoot.AppendChild(xmlChild);
xmlDocument.Save("XMLConfig.xml");
 

二.读取XML文件

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("XMLConfig.xml");

XmlNode xmlRoot = xmlDocument.SelectSingleNode("Root");
XmlNode xmlChild1 = xmlRoot.SelectSingleNode("Child1");
XmlNode xmlChild2 = xmlRoot.SelectSingleNode("Child2");
Console.WriteLine("xmlChild2.InnerText is:" + xmlChild2.InnerText);
XmlNode xmlChild3 = xmlRoot.SelectSingleNode("Child3");
XmlNode xmlChild3Child = xmlChild3.SelectSingleNode("Child3的XmlElementInner");

foreach (XmlAttribute value in xmlChild3Child.Attributes)
{
Console.WriteLine(value.Name + " " + value.Value);
}

Console.WriteLine("xmlChild3Child.InnerText is:" + xmlChild3Child.Attributes.GetNamedItem("我是键").Value);

 

 

<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <Child1 />
  <Child2>我是Child2的值呀</Child2>
  <Child3>
    <Child3的XmlElementInner 我是键="我是值" 我是键1="我是值1" />
  </Child3>
</Root>

 

        

以上是关于求 C++读写取XML 文件方法!网上复制的让开的主要内容,如果未能解决你的问题,请参考以下文章

c++ 开发中利用yaml-cpp读写yaml配置文件

SAP 如何取一个字段的文本

C++通过jsoncpp类库读写JSON文件-json用法详解

C++ Builder 中操作XML文件

Android JNI C++读写本地文件

c++ 怎么取list中特定的一块区域的值,比如list中有100条记录,我想直接取20-50的记录怎么取?新人求大神.