使用 vb.net 解析 xml 数据
parsing xml data with vb.net
我目前正在尝试使用 VB.net 解析数据以填充一些按子名称 "eResponse.01"、02、03 等选择的文本框,但是主标记中的名称空间/架构位置似乎出错了代码。
Dim xmlDoc As New XmlDocument()
xmlDoc.Load("C:\Users\james\Desktop\NEMSIS\EMS\xml\Test.xml")
Dim xmlns As New XmlNamespaceManager(xmlDoc.NameTable)
xmlns.AddNamespace("xsi", "http://www1w3.org/2001/XMLSchema-instance")
xmlns.AddNamespace("schemaLocation", "http://www.nemsis.org http://nemsis.org/media/nemsis_v3/release-3.4.0/XSDs/NEMSIS_XSDs/EMSDataSet_v3.xsd")
xmlns.AddNamespace("xmlns", "http://www.nemsis.org")
Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("/EMSDataSet/Header/PatientCareReport/eResponse")
For Each node As XmlNode In nodes
TextEdit1.Text = node.SelectSingleNode("eResponse.03").InnerText
Next
使用以下
时工作正常
<EMSDataSet>
<Header>
<DemographicGroup>
<dAgency.01>0</dAgency.01>
<dAgency.02>00</dAgency.02>
<dAgency.04>49</dAgency.04></DemographicGroup>
<PatientCareReport>
<eRecord>
<eRecord.01>OpP</eRecord.01>
<eRecord.SoftwareApplicationGroup>
<eRecord.02>G</eRecord.02>
<eRecord.03>Q</eRecord.03>
<eRecord.04>P</eRecord.04></eRecord.SoftwareApplicationGroup></eRecord>
<eResponse>
<eResponse.AgencyGroup>
<eResponse.01>a</eResponse.01>
<eResponse.02>BL</eResponse.02></eResponse.AgencyGroup>
<eResponse.03>u33</eResponse.03>
但是,如果我包含 namespace/schema
,它不会填充任何内容
<EMSDataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nemsis.org http://nemsis.org/media/nemsis_v3/release-3.4.0/XSDs/NEMSIS_XSDs/EMSDataSet_v3.xsd" xmlns="http://www.nemsis.org">
<Header>
<DemographicGroup>
<dAgency.01>0</dAgency.01>
<dAgency.02>00</dAgency.02>
<dAgency.04>49</dAgency.04></DemographicGroup>
<PatientCareReport>
<eRecord>
<eRecord.01>OpP</eRecord.01>
<eRecord.SoftwareApplicationGroup>
<eRecord.02>G</eRecord.02>
<eRecord.03>Q</eRecord.03>
<eRecord.04>P</eRecord.04></eRecord.SoftwareApplicationGroup></eRecord>
<eResponse>
<eResponse.AgencyGroup>
<eResponse.01>a</eResponse.01>
<eResponse.02>BL</eResponse.02></eResponse.AgencyGroup>
<eResponse.03>u33</eResponse.03>
我需要做什么才能让我的代码忽略开始标记中的额外数据 - 删除该信息不是一个选项。
您的 XML 具有无前缀的命名空间 - 也称为 默认命名空间 - 此处:
xmlns="http://www.nemsis.org"
与前缀命名空间不同,后代元素继承祖先默认命名空间隐式。
要访问命名空间中的元素,您需要在 XPath 中正确使用注册前缀并将命名空间管理器作为 SelectNodes()
和 SelectSingleNode()
的第二个参数传递:
......
xmlns.AddNamespace("d", "http://www.nemsis.org")
Dim xpath As String = "/d:EMSDataSet/d:Header/d:PatientCareReport/d:eResponse"
Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes(xpath, xmlns)
For Each node As XmlNode In nodes
TextEdit1.Text = node.SelectSingleNode("d:eResponse.03", xmlns).InnerText
Next
我目前正在尝试使用 VB.net 解析数据以填充一些按子名称 "eResponse.01"、02、03 等选择的文本框,但是主标记中的名称空间/架构位置似乎出错了代码。
Dim xmlDoc As New XmlDocument()
xmlDoc.Load("C:\Users\james\Desktop\NEMSIS\EMS\xml\Test.xml")
Dim xmlns As New XmlNamespaceManager(xmlDoc.NameTable)
xmlns.AddNamespace("xsi", "http://www1w3.org/2001/XMLSchema-instance")
xmlns.AddNamespace("schemaLocation", "http://www.nemsis.org http://nemsis.org/media/nemsis_v3/release-3.4.0/XSDs/NEMSIS_XSDs/EMSDataSet_v3.xsd")
xmlns.AddNamespace("xmlns", "http://www.nemsis.org")
Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("/EMSDataSet/Header/PatientCareReport/eResponse")
For Each node As XmlNode In nodes
TextEdit1.Text = node.SelectSingleNode("eResponse.03").InnerText
Next
使用以下
时工作正常<EMSDataSet>
<Header>
<DemographicGroup>
<dAgency.01>0</dAgency.01>
<dAgency.02>00</dAgency.02>
<dAgency.04>49</dAgency.04></DemographicGroup>
<PatientCareReport>
<eRecord>
<eRecord.01>OpP</eRecord.01>
<eRecord.SoftwareApplicationGroup>
<eRecord.02>G</eRecord.02>
<eRecord.03>Q</eRecord.03>
<eRecord.04>P</eRecord.04></eRecord.SoftwareApplicationGroup></eRecord>
<eResponse>
<eResponse.AgencyGroup>
<eResponse.01>a</eResponse.01>
<eResponse.02>BL</eResponse.02></eResponse.AgencyGroup>
<eResponse.03>u33</eResponse.03>
但是,如果我包含 namespace/schema
,它不会填充任何内容<EMSDataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nemsis.org http://nemsis.org/media/nemsis_v3/release-3.4.0/XSDs/NEMSIS_XSDs/EMSDataSet_v3.xsd" xmlns="http://www.nemsis.org">
<Header>
<DemographicGroup>
<dAgency.01>0</dAgency.01>
<dAgency.02>00</dAgency.02>
<dAgency.04>49</dAgency.04></DemographicGroup>
<PatientCareReport>
<eRecord>
<eRecord.01>OpP</eRecord.01>
<eRecord.SoftwareApplicationGroup>
<eRecord.02>G</eRecord.02>
<eRecord.03>Q</eRecord.03>
<eRecord.04>P</eRecord.04></eRecord.SoftwareApplicationGroup></eRecord>
<eResponse>
<eResponse.AgencyGroup>
<eResponse.01>a</eResponse.01>
<eResponse.02>BL</eResponse.02></eResponse.AgencyGroup>
<eResponse.03>u33</eResponse.03>
我需要做什么才能让我的代码忽略开始标记中的额外数据 - 删除该信息不是一个选项。
您的 XML 具有无前缀的命名空间 - 也称为 默认命名空间 - 此处:
xmlns="http://www.nemsis.org"
与前缀命名空间不同,后代元素继承祖先默认命名空间隐式。
要访问命名空间中的元素,您需要在 XPath 中正确使用注册前缀并将命名空间管理器作为 SelectNodes()
和 SelectSingleNode()
的第二个参数传递:
......
xmlns.AddNamespace("d", "http://www.nemsis.org")
Dim xpath As String = "/d:EMSDataSet/d:Header/d:PatientCareReport/d:eResponse"
Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes(xpath, xmlns)
For Each node As XmlNode In nodes
TextEdit1.Text = node.SelectSingleNode("d:eResponse.03", xmlns).InnerText
Next