C# 读取XML数据
示例:
<CreateLABApplicationService msg= '123'>
<Event>
<RecordDatetime>2022/11/1 9:56:38</RecordDatetime>
<Operator>0251 </Operator>
<EventFacility>1</EventFacility>
</Event>
<Demography>
<PatientID>1000168910</PatientID>
<MedicalRecordNo>1000168910</MedicalRecordNo>
<SSN>1</SSN>
<PatientName>测试</PatientName>
<Sex>2</Sex>
<Birthday>1984/3/28 0:00:00</Birthday>
<MaritalStatus>90</MaritalStatus>
</Demography>
</CreateLABApplicationService>
1、读取属性上的参数,例如:示例中的 msg的值 用Attributes[“XX”].Value;
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml("XML数据");
XmlElement element = xmlDocument.DocumentElement;
element.Attributes["msg"].Value;
2、读取Event节点的数据,用SelectSingleNode(参数1) 参数1:节点的路径
XmlNode Event = element.SelectSingleNode("//Event");
// 如果有多个Event节点 可以用SelectNodes() 参数同样是节点的路径
XmlNodeList Events = element.SelectNodes("//Event");
3、读取Event的子节点Operator的值,用.InnerText
Event.SelectSingleNode("//Operator").InnerText
其它一些常用代码
1、用DataTable创建XML格式代码
public static string CreateXmlByDataTable(DataTable dt)
{
if (dt == null)
{
return "";
}
StringBuilder builder = new StringBuilder();
// 改成按dt构造xml
foreach (DataRow dr in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
builder.Append($"\t<{column}>{dr[column].ToString()}</{column}>\n");
}
}
return builder.ToString();
}
注意:
1、当有多个相同节点时,如果是用.SelectNodes()取值,有可能会取到重复的数据,可以用XmlNode.Clone()先把数据保存到一个新的Node里面,再从新的Node里面找
示例:
<CreateLABApplicationService msg= '123'>
<Event>
<RecordDatetime>2022/11/1 9:56:38</RecordDatetime>
<Operator>0251 </Operator>
<Operator>0252 </Operator>
<EventFacility>1</EventFacility>
</Event>
<Event>
<RecordDatetime>2022/11/1 9:56:38</RecordDatetime>
<Operator>0253 </Operator>
<Operator>0254 </Operator>
<EventFacility>1</EventFacility>
</Event>
</CreateLABApplicationService>
如果要取两个Event下面的Operator节点的值。我们可能会用下面的代码:
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml("XML数据");
XmlElement element = xmlDocument.DocumentElement;
XmlNodeList lstEvent= element.SelectNodes("//Event");
foreach (XmlNode Event in lstEvent)
{
XmlNodeList lstOperator = Event.SelectNodes("//Operator");
// 这里获取到的lstOperator的数量其实已经不对了,本来应该是2,但找到的却是4,
// 因为它是按照路径来找的。
// 解决办法:先把这个节点复制出来,在新的这个里面找
XmlNode newEvent = Event.Clone();
XmlNodeList lstOperator = newEvent .SelectNodes("//Operator");
}