C++ 通过Qt读取xml
我不熟悉Qt和XML。请帮我解决这个问题。我会对你很好的。 这是我的XML文件格式C++ 通过Qt读取xml,c++,xml,qt,C++,Xml,Qt,我不熟悉Qt和XML。请帮我解决这个问题。我会对你很好的。 这是我的XML文件格式 < SiteSpecific> < SitesList>LocA;LocB;LocC< /SitesList> < LocA> < MaterialList>Material_A;Material_B</MaterialList> <Material Name="Material_A">
< SiteSpecific>
< SitesList>LocA;LocB;LocC< /SitesList>
< LocA>
< MaterialList>Material_A;Material_B</MaterialList>
<Material Name="Material_A">
<TemperatureList>-65;70;300;400;1000</TemperatureList>
<Density Value="0.286"/>
<PoissonRatio Value="0.27"/>
<Property tempid="01" temp="-65">
<Modulus Value="32.77E+6"/>
<Alpha Value="8.15E-6"/>
<YieldStrength Value="33.90E+3"/>
</Property>
<Property tempid="02" temp="70">
<Modulus Value="29.00E+6"/>
<Alpha Value="8.55E-6"/>
<YieldStrength Value="30.00E+3"/>
= </Property>
<Property tempid="03" temp="300">
<Modulus Value="27.50E+6"/>
<Alpha Value="9.26E-6"/>
<YieldStrength Value="22.40E+3"/>
</Property>
</Material>
</LocA>
< LocB>
< MaterialList>Material_C;Material_D</MaterialList>
<Material Name="Material_C">
<TemperatureList>-65;70;300;400;1000</TemperatureList>
<Density Value="0.286"/>
<PoissonRatio Value="0.27"/>
<Property tempid="01" temp="-65">
<Modulus Value="32.77E+6"/>
<Alpha Value="8.15E-6"/>
<YieldStrength Value="33.90E+3"/>
</Property>
<Material Name="Material_D">
<TemperatureList>-65;70;300;400;1000</TemperatureList>
<Density Value="0.286"/>
<PoissonRatio Value="0.27"/>
<Property tempid="01" temp="-65">
<Modulus Value="32.77E+6"/>
<Alpha Value="8.15E-6"/>
<YieldStrength Value="33.90E+3"/>
</Property>
</Material>
</LocB>
LocA;LocB;LocC
materiala;材料
-65;70;300;400;1000
=
Material\u C;材料
-65;70;300;400;1000
-65;70;300;400;1000
从上面的文件格式中,我必须提取唯物主义者(例如,Material_A、Material_B、Material_C、Material_D)、Temperaturelist(例如-65,703004001000)以及基于LocA和LocB的tempid的所有属性(模量、α和屈服强度)。这是“Qt方式”读取XML文档的两种主要方式阅读文档以获取示例和说明
就个人而言,我更喜欢QXmlStreamReader,但它确实有一个学习曲线
编辑:这里有一个小示例代码,未编译,让您大致了解:
//create some struct to store your data
struct material_t
{
QString name;
QList<MatProp> properties; //a list of your temp-modulus-Alpha-Yield entries
}
QList<material_t> readLocation(QXmlStreamReader& xml)
{
QStringList matnames;
QList<material_t> matlist;
while(xml.readNextStartElement())
{
if(xml.name() == "MaterialList")
matnames = xml.readElementText().split(";");
else if(matnames.contains(xml.name().toString()))
matlist.append(readMaterial(xml)); //write your own reader that returns a material_t
else
xml.skipCurrentElement(); //you must skip every unwanted element
}
return matlist;
}
void readStuff(QXmlStreamReader& xml, QList<material_t>& mats)
{
while(xml.readNextStartElement())
{
QStringList sitelist;
if(xml.name() == "SitesList") //key in on the XML node name
{
sitelist = xml.readElementText().split(";");
} else if(sitelist.contains(xml.name().toString()))
{
mats.append(readLocation(xml));
} else //you have to skip every unwanted element
xml.skipCurrentElement();
}
}
int main()
{
QList<material_t> materialist;
QFile file("your path here");
if(file.open(QIODevice::Text | QIODevice::ReadOnly)) //the QIODevice must be open
{
QXmlStreamReader xml(&file);
readStuff(xml, materiallist);
}
//do stuff with materiallist
}
//创建一些结构来存储数据
结构材料
{
QString名称;
QList properties;//您的temp module Alpha Yield条目列表
}
QList readLocation(QXmlStreamReader&xml)
{
QStringList-matnames;
QList材料清单;
while(xml.readNextStartElement())
{
if(xml.name()=“MaterialList”)
matnames=xml.readElementText().split(;);
else if(matnames.contains(xml.name().toString()))
append(readMaterial(xml));//编写自己的读取器,返回材料
其他的
xml.skipCurrentElement();//必须跳过所有不需要的元素
}
返回物料清单;
}
void readStuff(QXmlStreamReader和xml、QList和mats)
{
while(xml.readNextStartElement())
{
QStringList网站列表;
if(xml.name()=“SitesList”)//输入xml节点名
{
sitelist=xml.readElementText().split(;);
}else if(sitelist.contains(xml.name().toString()))
{
append(readLocation(xml));
}否则//您必须跳过所有不需要的元素
skipCurrentElement();
}
}
int main()
{
唯物主义者;
QFile文件(“此处的路径”);
if(file.open(QIODevice::Text | QIODevice::ReadOnly))//QIODevice必须打开
{
QXmlStreamReader xml(文件(&F);
readStuff(xml、材料列表);
}
//与材料专家合作
}
和是读取XML文档的两种主要方式“Qt方式”。阅读文档以获取示例和说明
就个人而言,我更喜欢QXmlStreamReader,但它确实有一个学习曲线
编辑:这里有一个小示例代码,未编译,让您大致了解:
//create some struct to store your data
struct material_t
{
QString name;
QList<MatProp> properties; //a list of your temp-modulus-Alpha-Yield entries
}
QList<material_t> readLocation(QXmlStreamReader& xml)
{
QStringList matnames;
QList<material_t> matlist;
while(xml.readNextStartElement())
{
if(xml.name() == "MaterialList")
matnames = xml.readElementText().split(";");
else if(matnames.contains(xml.name().toString()))
matlist.append(readMaterial(xml)); //write your own reader that returns a material_t
else
xml.skipCurrentElement(); //you must skip every unwanted element
}
return matlist;
}
void readStuff(QXmlStreamReader& xml, QList<material_t>& mats)
{
while(xml.readNextStartElement())
{
QStringList sitelist;
if(xml.name() == "SitesList") //key in on the XML node name
{
sitelist = xml.readElementText().split(";");
} else if(sitelist.contains(xml.name().toString()))
{
mats.append(readLocation(xml));
} else //you have to skip every unwanted element
xml.skipCurrentElement();
}
}
int main()
{
QList<material_t> materialist;
QFile file("your path here");
if(file.open(QIODevice::Text | QIODevice::ReadOnly)) //the QIODevice must be open
{
QXmlStreamReader xml(&file);
readStuff(xml, materiallist);
}
//do stuff with materiallist
}
//创建一些结构来存储数据
结构材料
{
QString名称;
QList properties;//您的temp module Alpha Yield条目列表
}
QList readLocation(QXmlStreamReader&xml)
{
QStringList-matnames;
QList材料清单;
while(xml.readNextStartElement())
{
if(xml.name()=“MaterialList”)
matnames=xml.readElementText().split(;);
else if(matnames.contains(xml.name().toString()))
append(readMaterial(xml));//编写自己的读取器,返回材料
其他的
xml.skipCurrentElement();//必须跳过所有不需要的元素
}
返回物料清单;
}
void readStuff(QXmlStreamReader和xml、QList和mats)
{
while(xml.readNextStartElement())
{
QStringList网站列表;
if(xml.name()=“SitesList”)//输入xml节点名
{
sitelist=xml.readElementText().split(;);
}else if(sitelist.contains(xml.name().toString()))
{
append(readLocation(xml));
}否则//您必须跳过所有不需要的元素
skipCurrentElement();
}
}
int main()
{
唯物主义者;
QFile文件(“此处的路径”);
if(file.open(QIODevice::Text | QIODevice::ReadOnly))//QIODevice必须打开
{
QXmlStreamReader xml(文件(&F);
readStuff(xml、材料列表);
}
//与材料专家合作
}
请参阅并参阅和