如下XML文件:
<?xml version="1.0" encoding="utf-8"?>
<INTELLISENSE>
<Groups>
<Group Name="CLASS">
<Variables>
<Variable Name="ON_ALARM" Desc="" Type="Boolean" />
<Variable Name="ALARM_RESET_COMMAND" Desc="" Type="Boolean" />
<Variable Name="C11" Desc="" Type="Boolean" />
<Variable Name="C12" Desc="" Type="Boolean" />
<Variable Name="C13" Desc="" Type="Boolean" />
<Variable Name="C14" Desc="" Type="Boolean" />
<Variable Name="C15" Desc="" Type="Boolean" />
<Variable Name="C16" Desc="" Type="Boolean" />
<Variable Name="C21" Desc="" Type="Boolean" />
<Variable Name="C22" Desc="" Type="Boolean" />
<Variable Name="C23" Desc="" Type="Boolean" />
<Variable Name="C24" Desc="" Type="Boolean" />
<Variable Name="C25" Desc="" Type="Boolean" />
<Variable Name="C26" Desc="" Type="Boolean" />
<Variable Name="C31" Desc="" Type="Boolean" />
<Variable Name="C32" Desc="" Type="Boolean" />
<Variable Name="C33" Desc="" Type="Boolean" />
</Variables>
</Group>
<Group Name="EVENT">
<Variables>
<Variable Name="CurrentDevice" Type="String" />
<Variable Name="VR4CommError" Type="Boolean" />
</Variables>
</Group>
<Group Name="FUNCTION">
<Variables>
<Variable Name="IDLE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="IDLE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_HOUR/MINUTE" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="TOTAL_TIME_FOR_EMERGENCY" Desc="" Type="UInt32" />
</Variables>
</Group>
<Group Name="INTERFACE">
<Variables>
<Variable Name="IDLE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="IDLE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_HOUR/MINUTE" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="TOTAL_TIME_FOR_EMERGENCY" Desc="" Type="UInt32" />
</Variables>
</Group>
<Group Name="PROPERTY">
<Variables>
<Variable Name="IDLE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="IDLE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_HOUR/MINUTE" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="TOTAL_TIME_FOR_EMERGENCY" Desc="" Type="UInt32" />
</Variables>
</Group>
</Groups>
</INTELLISENSE>
想从XML中把各个"Name"的值读取出来,并且按Group Name类别,保存成一个Collection,如何才能实现阿?跪求代码
<?xml version="1.0" encoding="utf-8"?>
<INTELLISENSE>
<Groups>
<Group Name="CLASS">
<Variables>
<Variable Name="ON_ALARM" Desc="" Type="Boolean" />
<Variable Name="ALARM_RESET_COMMAND" Desc="" Type="Boolean" />
<Variable Name="C11" Desc="" Type="Boolean" />
<Variable Name="C12" Desc="" Type="Boolean" />
<Variable Name="C13" Desc="" Type="Boolean" />
<Variable Name="C14" Desc="" Type="Boolean" />
<Variable Name="C15" Desc="" Type="Boolean" />
<Variable Name="C16" Desc="" Type="Boolean" />
<Variable Name="C21" Desc="" Type="Boolean" />
<Variable Name="C22" Desc="" Type="Boolean" />
<Variable Name="C23" Desc="" Type="Boolean" />
<Variable Name="C24" Desc="" Type="Boolean" />
<Variable Name="C25" Desc="" Type="Boolean" />
<Variable Name="C26" Desc="" Type="Boolean" />
<Variable Name="C31" Desc="" Type="Boolean" />
<Variable Name="C32" Desc="" Type="Boolean" />
<Variable Name="C33" Desc="" Type="Boolean" />
</Variables>
</Group>
<Group Name="EVENT">
<Variables>
<Variable Name="CurrentDevice" Type="String" />
<Variable Name="VR4CommError" Type="Boolean" />
</Variables>
</Group>
<Group Name="FUNCTION">
<Variables>
<Variable Name="IDLE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="IDLE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_HOUR/MINUTE" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="TOTAL_TIME_FOR_EMERGENCY" Desc="" Type="UInt32" />
</Variables>
</Group>
<Group Name="INTERFACE">
<Variables>
<Variable Name="IDLE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="IDLE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_HOUR/MINUTE" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="TOTAL_TIME_FOR_EMERGENCY" Desc="" Type="UInt32" />
</Variables>
</Group>
<Group Name="PROPERTY">
<Variables>
<Variable Name="IDLE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="IDLE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="UTILISED_TIME_HOUR/MINUTE" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_SECOND" Desc="" Type="UInt16" />
<Variable Name="OCCUPITE_TIME_HOUR/MINUTE" Desc="" Type="UInt16" />
<Variable Name="TOTAL_TIME_FOR_EMERGENCY" Desc="" Type="UInt32" />
</Variables>
</Group>
</Groups>
</INTELLISENSE>
想从XML中把各个"Name"的值读取出来,并且按Group Name类别,保存成一个Collection,如何才能实现阿?跪求代码
解决方案 »
- C#打印datagridview里面的内容
- 关于listbox显示数据问题
- .net怎么可以控制一个控件的事件无效?
- 求一个超强的SQL语句的转换,要多少分给多少分,要是回答出来,我以后改别人的项目再也不怕了。哪个回答出来我将感激他一辈子
- 事务(进程)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务
- 为什么COM组件都是用C++写的,其它的语言可以写吗,例如C#
- 小问题,请问如何获取TabControl中选择是哪个TabPage? 急.....
- C#中是否能像 java 一样生成帮助文档
- .net分布式开发,中间层组件要用到.net中的那些技术?比如xml,ado.net Romoting,事务处理,webservice等.
- 为什么我将AlowSorting属性设为false后,DataGrid仍可排序
- ImageField中DataImageUrlFormatString的设置!!!
- XML取值 的问题,大家帮忙,谢谢了
ds.ReadXml(Server.MapPath("~/xmlFile.xml"));
DataTable dtGroup = ds.Tables["Group"];
DataTable dtVariable = ds.Tables["Variable"];
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;namespace SimpleTester2.test1 {
class Class1 : ITest {
#region ITest 成员
Dictionary<string , string> datastore = new Dictionary<string , string>(); int = 0;
/// <summary>
/// 想从XML中把各个"Name"的值读取出来,并且按Group Name类别,保存成一个Collection,如何才能实现阿?跪求代码
/// </summary>
public void Run() {
XDocument xd = XDocument.Load("test1/test.xml");
foreach (XElement item in xd.Descendants()) {
if (item.Parent != null && item.Parent.Parent != null &&item.Parent.Parent.Attribute("Name")!=null&& item.Parent.Parent.Attribute("Name").Value == "CLASS") {
datastore.Add("CLASS"+.ToString() , item.Attribute("Name").Value);
++;
} else if (item.Parent != null && item.Parent.Parent != null && item.Parent.Parent.Attribute("Name") != null && item.Parent.Parent.Attribute("Name").Value == "EVENT") {
datastore.Add("EVENT" + .ToString() , item.Attribute("Name").Value);
++;
} else if (item.Parent != null && item.Parent.Parent != null && item.Parent.Parent.Attribute("Name") != null && item.Parent.Parent.Attribute("Name").Value == "FUNCTION") {
datastore.Add("FUNCTION" + .ToString() , item.Attribute("Name").Value);
++;
} else if (item.Parent != null && item.Parent.Parent != null && item.Parent.Parent.Attribute("Name") != null && item.Parent.Parent.Attribute("Name").Value == "FUNCTION") {
datastore.Add("INTERFACE" + .ToString() , item.Attribute("Name").Value);
++;
} else if (item.Parent != null && item.Parent.Parent != null && item.Parent.Parent.Attribute("Name") != null && item.Parent.Parent.Attribute("Name").Value == "PROPERTY") {
datastore.Add("PROPERTY" + .ToString() , item.Attribute("Name").Value);
++;
}
}
Console.Read();
} #endregion
}
if(item.Key.SubString(0,item.Key.Length-1)=="CLASS")
{
//...
}
//...
}
{ public XGroupType(string _GroupName, string _Name)
{
GroupName = _GroupName;
Name = _Name; }
string GroupName;
string Name; public override string ToString()
{
return "GroupName: " + GroupName + " - Name: " + Name;
} }
void readXML()
{ XmlDocument doc = new XmlDocument();
doc.Load("c:\\1.xml");
XmlNodeList list = doc.SelectNodes("/INTELLISENSE/Groups/Group");
string groupName = "";
string sName = "";
XGroupType myType;
List<XGroupType> myList = new List<XGroupType>();
foreach (XmlNode node in list)
{ groupName = node.Attributes["Name"].Value; foreach (XmlNode oNode in node.SelectNodes("Variables/Variable"))
{ sName = oNode.Attributes["Name"].Value;
myType = new XGroupType(groupName, sName);
myList.Add(myType); } }
//test
MessageBox.Show(myList.Count.ToString());
MessageBox.Show(myList[0].ToString());
MessageBox.Show(myList[1].ToString());
}
调用:readXML();
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "a.dtd"><person>
<people>
<name>陈</name>
<sex>male</sex>
<age>30</age>
</people>
<people>
<name>abched</name>
<sex>female</sex>
<age>1</age>
</people>
</person>声明了一个XML处理类:struct suPerson
{
string _name;
string _sex;
int _age;
};class TParse
{
private:
string _strErrMsg;DOMImplementation *_impl;
DOMBuilder *_parser;
DOMWriter* _writer;
DOMDocument* _doc;
DOMDocument* _newDoc;vector<suPerson> _vecPerson;bool parseNode(DOMNode *n);
public:
TParse();
~TParse();bool parse(const char* strXmlFile);
bool newDoc(const char* strXmlFile);string getErrMsg()
{
return _strErrMsg;
}
vector<suPerson> getVector()
{
return _vecPerson;
}
};类的具体定义如下:#include "Parse.h"TParse::TParse()
{
try
{
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch)
{
char* message = XMLString::transcode(toCatch.getMessage());
_strErrMsg = message;
XMLString::release(&message);
throw _strErrMsg;
}
XMLCh tempStr[100];
XMLString::transcode("LS", tempStr, 99);
_impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
_parser = _impl->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0);_writer = ((DOMImplementationLS*)_impl)->createDOMWriter();// optionally, set some DOMWriter features
// set the format-pretty-print feature
if (_writer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true))
_writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);// set the byte-order- feature
if (_writer->canSetFeature(XMLUni::fgDOMWRTBOM, true))
_writer->setFeature(XMLUni::fgDOMWRTBOM, true);
}TParse::~TParse()
{
_parser->release();
if (_newDoc)
_newDoc->release();
_writer->release();
}bool TParse::parse(const char* strXmlFile)
{
try
{
_doc = _parser->parseURI(XMLString::transcode(strXmlFile));
}
catch (const XMLException& toCatch)
{
char* message = XMLString::transcode(toCatch.getMessage());
_strErrMsg = message;
XMLString::release(&message);
throw _strErrMsg;
}
catch (const DOMException& toCatch)
{
char* message = XMLString::transcode(toCatch.msg);
_strErrMsg = message;
XMLString::release(&message);
throw _strErrMsg;
}
catch (...)
{
_strErrMsg = "Unexpected Exception n";
throw _strErrMsg;
}if (!_doc)
{
_strErrMsg = "_doc is null";
return false;
}
DOMNode* n = (DOMNode*)_doc->getDocumentElement();
_vecPerson.clear();if (!n)
{
_strErrMsg = "it is not an legal node";
return false;
}if (n)
{
if (n->getNodeType() == DOMNode::ELEMENT_NODE)
{
DOMNodeList* nodeList = n->getChildNodes();
unsigned int nListLen = nodeList->getLength();
for (unsigned int i=0; i<nListLen; ++i)
{
DOMNode* nodeTemp = nodeList->item(i);
if (nodeTemp->getNodeType() == DOMNode::ELEMENT_NODE)
{
suPerson suTemp;
memset(&suTemp, 0, sizeof(suTemp));
for (DOMNode* node1=nodeTemp->getFirstChild(); node1!=0; node1=node1->getNextSibling())
{char* name = XMLString::transcode(node1->getNodeName());
string strTemp = name;
if (strTemp == "name")
{
suTemp._name = XMLString::transcode(node1->getFirstChild()->getNodeValue());
node1->getFirstChild()->setNodeValue(XMLString::transcode((suTemp._name+" hello").c_str()));
}
else if (strTemp == "sex")
{
suTemp._sex = XMLString::transcode(node1->getFirstChild()->getNodeValue());
}
else if (strTemp == "age")
{
suTemp._age = XMLString::parseInt(node1->getFirstChild()->getNodeValue());
}XMLString::release(&name);
}
_vecPerson.push_back(suTemp);
}
}}
}
return true;
}//---------------------------------------------------------------------------
bool TParse::newDoc(const char* strXmlFile)
{
try
{
_newDoc = _impl->createDocument();
}
catch (const XMLException& toCatch)
{
char* message = XMLString::transcode(toCatch.getMessage());
_strErrMsg = message;
XMLString::release(&message);
throw _strErrMsg;
}
catch (const DOMException& toCatch)
{
char* message = XMLString::transcode(toCatch.msg);
_strErrMsg = message;
XMLString::release(&message);
throw _strErrMsg;
}
catch (...)
{
_strErrMsg = "Unexpected Exception n";
throw _strErrMsg;
}DOMElement* root = _newDoc->createElement(XMLString::transcode("person"));
for (unsigned int i=0; i<2; ++i)
{
DOMElement* item = _newDoc->createElement(XMLString::transcode("people"));
DOMElement* name = _newDoc->createElement(XMLString::transcode("name"));
DOMAttr* attr = _newDoc->createAttribute(XMLString::transcode("id"));
attr->setNodeValue(XMLString::transcode("hello"));
name->appendChild(_newDoc->createTextNode(XMLString::transcode("C陈")));
name->setAttributeNode(attr);
DOMElement* sex = _newDoc->createElement(XMLString::transcode("male"));
sex->appendChild(_newDoc->createTextNode(XMLString::transcode("male")));
DOMElement* age = _newDoc->createElement(XMLString::transcode("age"));
age->appendChild(_newDoc->createTextNode(XMLString::transcode("30")));
item->appendChild(name);
item->appendChild(sex);
item->appendChild(age);
root->appendChild(item);
}
_newDoc->appendChild(root);// construct the LocalFileFormatTarget
XMLFormatTarget *myFormatTarget = new LocalFileFormatTarget(strXmlFile);// serialize a DOMNode to the local file "myXMLFile.xml"
_writer->writeNode(myFormatTarget, *_newDoc->getDocumentElement());// optionally, you can flush the buffer to ensure all contents are written
myFormatTarget->flush();// release the memory
delete myFormatTarget;
return true;
}测试代码:#include "Parse.h"int main (int argc, char* args[])
{
try
{
TParse parse;
if (!parse.parse("a.xml"))
{
cout << "error: " << parse.getErrMsg() << endl;
}
vector<suPerson> vecTemp = parse.getVector();
for (unsigned int i=0; i<vecTemp.size(); ++i)
{
cout << i << "--------------" << endl;
cout << "name: " << vecTemp[i]._name << endl;
cout << "sex: " << vecTemp[i]._sex << endl;
cout << "age: " << vecTemp[i]._age << endl;
}
cout << "--------------------------------" << endl;
parse.newDoc("b.xml");
}
catch(const string& str)
{
cout << "error: " << str << endl;
}
cin.get();
return 0;
}