求 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++通过jsoncpp类库读写JSON文件-json用法详解
c++ 怎么取list中特定的一块区域的值,比如list中有100条记录,我想直接取20-50的记录怎么取?新人求大神.