parsing xml data with vb.net

前提是你 提交于 2019-12-11 12:29:01

问题


I am currently attempting to parse data with VB.net to populate some textboxes selecting by childname "eResponse.01", 02, 03 etc however a namespace / schema location in the main tag seems to be tripping up the code.

    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

works fine when using the following

<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>

however it does not populate anything if I include the 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>

what do I need to do to get my code to ignore extra data in the opening tag - removing that information is not an option.


回答1:


Your XML has unprefixed namespace -also known as default namespace- here :

xmlns="http://www.nemsis.org"

unlike prefixed namespace, descendant elements inherit ancestor default namespace implicitly.

To access elements in namespace, you need to use registered prefix properly in your XPath and pass the namespace manager as 2nd argument of SelectNodes() and 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


来源:https://stackoverflow.com/questions/31034760/parsing-xml-data-with-vb-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!