在C#中解析XML以检索值

时间:2017-12-22 22:23:27

标签: c# xml

我需要解析并读取以下XML格式的值:

<?xml version="1.0"?>
<Patients xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Person xmlns="http://ehr.org/VM/" NationalCode="1234" LastName="Morgan" FirstName="Alen">
    </Person>
</Patients>

我尝试使用以下代码读取患者姓名和生日详情但由于某种原因xml.SelectNodes(&#34; / Patients / Person&#34;)为空,任何想法如何阅读来自xml?

的值
XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString); 

XmlNodeList xnList = xml.SelectNodes("/Patients/Person");
foreach (XmlNode xn in xnList)
{
  string firstName = xn["FirstName"].InnerText;
  string lastName  = xn["LastName"].InnerText;
}

1 个答案:

答案 0 :(得分:2)

您需要解决几件事。

首先,XML中的Person类型限定为命名空间,因此在搜索该节点时需要包含该命名空间(通过XmlNamespaceManager)。

要执行此操作,请通过AddNamespace方法添加命名空间,并为其指定别名和要在搜索中使用的命名空间。在我的示例中,我使用了别名ehr

然后,将命名空间管理器提供到.SelectNodes()并在搜索字符串中将“Person”作为前缀加上别名(例如:/Patients/ehr:Person

其次,FirstNameLastName项是属性,您必须通过Attributes属性访问这些属性。只需使用xn["FirstName"]即可查找具有该名称的子节点。

这是工作代码:

XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString);

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("ehr", "http://ehr.org/VM/");

XmlNodeList xnList = xml.SelectNodes("/Patients/ehr:Person", nsmgr);
foreach (XmlNode xn in xnList)
{

     string firstName = xn.Attributes["FirstName"].Value;
     string lastName = xn.Attributes["LastName"].Value;
}