怎样取出Xml中所有对象的内容

阿斯兰 2009-12-22 10:21:00
<?xml version="1.0" encoding="utf-8"?>
<Patients>
<Patients_virtue ID = "001">
<Last_Name>jay </Last_Name>
<First_Name>hoho </First_Name>
<MI>0091 </MI>
<Creation_Date>20091220 </Creation_Date>
<Patient_ID>100 </Patient_ID>
</Patients_virtue>
<Patients_virtue ID = "002">
<Last_Name>LiLi </Last_Name>
<First_Name>ccc </First_Name>
<MI>1015 </MI>
<Creation_Date>20091221 </Creation_Date>
<Patient_ID>101 </Patient_ID>
</Patients_virtue>
<Patients_virtue ID = "003">
<Last_Name>suzuki </Last_Name>
<First_Name>tanaka </First_Name>
<MI>1231 </MI>
<Creation_Date>20091222 </Creation_Date>
<Patient_ID>110 </Patient_ID>
</Patients_virtue>
</Patients>

上面的xml文件中有 3个病人的信息 我想通过调用一个函数依次取出每个病人的信息 ,每次调用都取出一个病人的信息,创建一个病人的对象 并把 取出的信息赋给 对象的成员变量。 根据xml文件提示 我需要循环调用3次函数 取出这3个病人的信息 ,分别赋给 3给对象的 成员变量。
...全文
195 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyanglexh 2009-12-22
  • 打赏
  • 举报
回复
ProjectDD的方法很好。

ProjectDD 2009-12-22
  • 打赏
  • 举报
回复
出了用XML DOM 等来读以外,你还可以考虑使用 XML的序列化来读写

我试了下你的原XML文档 ,有报错,就仿制了一个XML文档 如下

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPatients_virtue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Patients_virtue ID="003">
<Last_Name>ln1</Last_Name>
<First_Name>test1</First_Name>
<MI>aaa</MI>
<Creation_Date>2009-12-22T12:44:10.2373046+08:00</Creation_Date>
<Patient_ID>0231</Patient_ID>
</Patients_virtue>
<Patients_virtue ID="004">
<Last_Name>ln2</Last_Name>
<First_Name>test2</First_Name>
<MI>aaa2</MI>
<Creation_Date>2009-12-22T12:44:10.2392578+08:00</Creation_Date>
<Patient_ID>0232</Patient_ID>
</Patients_virtue>
<Patients_virtue ID="005">
<Last_Name>ln3</Last_Name>
<First_Name>test3</First_Name>
<MI>aabb</MI>
<Creation_Date>2009-12-22T12:44:10.2392578+08:00</Creation_Date>
<Patient_ID>0233</Patient_ID>
</Patients_virtue>
</ArrayOfPatients_virtue>

//----------

这个文档 通过了XML序列化的测试,可以读写,因为这是个集合对象所以按MSDN文档要求,需要先定义两个类,一个是集合元素类,一个是,集合类,MSDN要求 继承集合类,来实现它以完成序列的要求

象这样定义:
元素类:
public class Patients_virtue {
[XmlAttribute]
public string ID { get; set; }
[XmlElementAttribute]
public string Last_Name { get; set; }
[XmlElementAttribute]
public string First_Name { get; set; }
[XmlElementAttribute]
public string MI { get; set; }
[XmlElementAttribute]
public DateTime Creation_Date { get; set; }
[XmlElementAttribute]
public string Patient_ID { get; set; }
}
集合类:
public class mc:ICollection {
List<Patients_virtue> pvl;
public mc() {
this.pvl = new List<Patients_virtue>();
}
#region ICollection 成员

public void CopyTo(Array array , int index) {
this.pvl.CopyTo((Patients_virtue[])array);
}

public int Count {
get { return this.pvl.Count; }
}

public bool IsSynchronized {
get { return false; }
}

public object SyncRoot {
get { return this; }
}

#endregion

#region IEnumerable 成员

public IEnumerator GetEnumerator() {
throw new NotImplementedException();
}

#endregion
public void Add(Patients_virtue pv) {
this.pvl.Add(pv);
}
public Patients_virtue this[int index] {
get { return this.pvl[index]; }
}
}
//
测试:
public void Run() {
string path = "testresult.xml";
XmlSerializer xs = new XmlSerializer(typeof(mc));
XmlReader xr = XmlReader.Create(path);

var v = xs.Deserialize(xr);
//mc m = new mc();
//m.Add(new Patients_virtue() { First_Name = "test1" , Last_Name = "ln1" , MI = "aaa" , ID = "003" , Creation_Date = DateTime.Now , Patient_ID = "0231" });
//m.Add(new Patients_virtue() { First_Name = "test2" , Last_Name = "ln2" , MI = "aaa2" , ID = "004" , Creation_Date = DateTime.Now , Patient_ID = "0232" });
//m.Add(new Patients_virtue() { First_Name = "test3" , Last_Name = "ln3" , MI = "aabb" , ID = "005" , Creation_Date = DateTime.Now , Patient_ID = "0233" });
//using (StreamWriter sw=new StreamWriter(File.Open(path,FileMode.OpenOrCreate,FileAccess.Write))) {
// xs.Serialize(sw , m);
//}
}
//测试的Run方法中的下半部分注释的是 序列化到XML文档,而上半部分是 从XML读取,经测试
可以方便的读出集合对象。
阿斯兰 2009-12-22
  • 打赏
  • 举报
回复
fyanglexh 至于你的回答,我没有看到确切的解决我当前问题的方法,我现在的阶段是处于学习并运用的阶段,现在对这些了解的太少了 方向还是不清晰的。。如果不是针对性的答案 那我更不知道怎么看下去了。所以我只想要看到 解决我当前问题的方法 和不是 看所有的书 ,只有我看到确切的方法才能根据这个例子 更深入的学习,和运用。。。名白了么?如果我 提问题就是为了得到一本书 请问我还需要提问么,我直接赵本书来看好了,关键是:提问的目的是要解决当前的问题。
fyanglexh 2009-12-22
  • 打赏
  • 举报
回复
下面回帖的人多注意,楼主只想要鱼,不需要渔。。。
fyanglexh 2009-12-22
  • 打赏
  • 举报
回复
好心忠告:仔细研究下xpath语法,那么你的xml问题都迎刃而解。。。

我是从网上找的最全,最好理解并带实例的说明给楼主粘上的。

没想到被搂住误解。我还在想呢,楼主为什么总是问同样类似的问题,可能还是没好好看xpath语法。

呵呵,既然楼主比较讨厌,那我就向你道歉了,又给你增添了一份烦恼和郁闷,不知不为过,楼主多包涵。。。
fyanglexh 2009-12-22
  • 打赏
  • 举报
回复
呵呵。领教。。。
阿斯兰 2009-12-22
  • 打赏
  • 举报
回复
fyanglexh 我所说的 复制粘贴于本文不相关的 东西 就是说的你 。你能不能远点。我感觉你好无聊,今天又在复制昨天给我回复问题的人的原帖。。你有意思没 你下面的粘贴仍旧还是和昨天一样 放了一大片 于本文无关的东西。。。。我不想再看见你
fyanglexh 2009-12-22
  • 打赏
  • 举报
回复

xmldocment doc=new xmldocment();
doc.load("xxx.xml");
xmlnode node=doc.docmentelement.selectsinglenode("//Patients");
for(int i=0;i<node.children.cout;i++)
{
_LastName=node.children[i][0].innerText.value;
_FirstName=node.children[i][1].innerText.value;
}

非常重要的xpath语法
选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:
表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

实例
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点
/bookstore 选取根元素 bookstore

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取所有属于 bookstore 的子元素的 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取所有名为 lang 的属性。
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position() <3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点

实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子节点
//* 选取文档中的所有元素
//title[@*] 选取所有带有属性的 title 元素。
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取所有 book 元素的 title 和 price 元素。
//title | //price 选取所有文档中的 title 和 price 元素。
/bookstore/book/title | //price 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。
shuangchonggeng 2009-12-22
  • 打赏
  • 举报
回复
可以利用xmlDataSource控件,设置他的XPath表达式来限制每次所取得值。
不懂装懂 2009-12-22
  • 打赏
  • 举报
回复
DataSet ds=new DataSet();
ds.ReadXml("xml文件路径");
hitlcyu19 2009-12-22
  • 打赏
  • 举报
回复
http://www.xueit.com/html/2009-08/21_4275_00.html
参考这个吧
hhc123 2009-12-22
  • 打赏
  • 举报
回复
回去好好读一下书,看下如何操作xml吧。
hhc123 2009-12-22
  • 打赏
  • 举报
回复
回去好好读一下书,看下如何操作xml吧。
阿斯兰 2009-12-22
  • 打赏
  • 举报
回复
感谢 ProjectDD 的解答

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧