当我以动态方式在一个XML文档中有两个标题时,如何从XML文件中检索所有值?

时间:2018-11-16 09:43:29

标签: xml vb.net oracle

我需要使用动态方式从My XML文件中获取值。

HERE IS MY ORGINAL XML FILE

我用来获取值的代码是@jdweng提供的,我可以工作...但是我需要一种动态方式。因为这种方式的问题是如果我更改标签的名称……我也需要去代码去改变名字....但是如果我把路径保存在一个表中..我就去那个表,然后在这里改变。 这也是解决方案

我目前拥有的代码:

Private Sub GetContinents()

    Const FILENAME As String = "C:test.xml"

    Dim settings As XmlReaderSettings = New XmlReaderSettings()

    settings.ConformanceLevel = ConformanceLevel.Fragment

    Dim reader As XmlReader = XmlReader.Create(FILENAME, settings)


    Dim dt As DataTable = New DataTable()
    dt.Columns.Add("Display Name", GetType(String))
    dt.Columns.Add("Code", GetType(String))
    dt.Columns.Add("Esame", GetType(String))
    dt.Columns.Add("Esito", GetType(String))
    dt.Columns.Add("Abnormal Flag", GetType(String))
    dt.Columns.Add("Unita Di Misura", GetType(String))
    dt.Columns.Add("Range Di Riferimento", GetType(String))
    dt.Columns.Add("Metoda", GetType(String))
    dt.Columns.Add("Low", GetType(Decimal))
    dt.Columns.Add("High", GetType(Decimal))
    dt.Columns.Add("Time", GetType(DateTime))


    Dim uri = "urn:hl7-org:v3"

    While (Not reader.EOF)

        If reader.Name <> "section" Then

            reader.ReadToFollowing("section", uri)
        End If
        If Not reader.EOF Then

            Dim section As XElement = CType(XElement.ReadFrom(reader), XElement)

            Dim xCode As XElement = section.Descendants().Where(Function(x) x.Name.LocalName = "code").FirstOrDefault()
            Dim displayName As String = CType(xCode.Attribute("displayName"), String)

            For Each xComponent As XElement In section.Elements().Where(Function(x) x.Name.LocalName = "component")
                Dim xEsame As XElement = xComponent.Descendants().Where(Function(x) x.Name.LocalName = "code").FirstOrDefault()
                Dim code As String = CType(xEsame.Attribute("code"), String)

                Dim xBody As XElement = xComponent.Descendants().Where(Function(x) x.Name.LocalName = "tbody").FirstOrDefault()
                Dim data As New List(Of String)
                data.AddRange({displayName, code})

                data.AddRange(xBody.Descendants().Where(Function(x) x.Name.LocalName = "td").Select(Function(x) CType(x, String)))

                Dim entry As XElement = section.Descendants().Where(Function(x) x.Name.LocalName = "entry").FirstOrDefault()

                Dim low As XElement = entry.Descendants().Where(Function(x) x.Name.LocalName = "low").FirstOrDefault()
                If low Is Nothing Then
                    data.Add(Nothing)
                Else
                    data.Add(Decimal.Parse(CType(low.Attribute("value"), String)))
                End If
                Dim high As XElement = entry.Descendants().Where(Function(x) x.Name.LocalName = "high").FirstOrDefault()
                If high Is Nothing Then
                    data.Add(Nothing)
                Else
                    data.Add(Decimal.Parse(CType(high.Attribute("value"), String)))
                End If

                Dim effectiveTime As XElement = entry.Descendants().Where(Function(x) x.Name.LocalName = "effectiveTime").FirstOrDefault()
                Dim dateStr As String = CType(effectiveTime.Attribute("value"), String)
                data.Add(DateTime.ParseExact(dateStr, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture))

                'For i = 0 To data.Count - 1
                Insert_CDA_Data(data)
                '    i = i + 11
                'Next
                'dt.Rows.Add(data.ToArray())
                'Debug.WriteLine(dt)

            Next xComponent

        End If
    End While

End Sub

Private Function Insert_CDA_Data(ByVal data As List(Of String))
    Dim esito As Boolean = True

    Try
        Using scope As New TransactionScope()

            operations.INSERT_CDA(ucDataCapture(data))
            scope.Complete()
        End Using

    Catch ex As Exception
        esito = False
        Dim log As New Log
        log.writeLog("Cda", ex)
    End Try

    Return esito
End Function

Private Function ucDataCapture(ByVal data As List(Of String)) As CDA

    Dim CDA_D As New CDA

    Try
        CDA_D.codeProperty = data(1)
        CDA_D.nameProperty = data(0)
        CDA_D.esameProperty = data(2)
        CDA_D.esitoProperty = data(3)
        CDA_D.abnormalFlagProperty = data(4)
        CDA_D.unitaDiMisuraProperty = data(5)
        CDA_D.rangeDiRiferimentoProperty = data(6)
        CDA_D.metodaProperty = data(7)
        If data(8) IsNot Nothing Then
            CDA_D.lowProperty = data(8)
        Else
            CDA_D.lowProperty = ""
        End If
        If data(9) IsNot Nothing Then
            CDA_D.highProperty = data(9)
        Else
            CDA_D.highProperty = ""
        End If

        CDA_D.effectiveTimeProperty = data(10)
    Catch ex As Exception
        Dim log As New Log
        log.writeLog("Cda ", ex)
    End Try
    Return CDA_D

End Function

谢谢您的帮助。

所以表应该看起来像那个表,因为第一个标题的值没有高或低,所以只有在有一个值的情况下,该值才有效。

table

所以我可以尝试这种方式。...

Imports System.IO

导入System.Xml

模块CdaParser     子Main()

    Try
        Console.Write("Enter CDA path: ")

        Dim FilePath = Console.ReadLine()

        If Not File.Exists(FilePath)
            throw New Exception("Error! File does not exist.")
        End If

        'Load CDA
        Dim Document = New XmlDocument()

        Document.Load(FilePath)
        'Load CDA

        'Fetch and load namespaces
        Dim DocumentNamespaces = New XmlNamespaceManager(Document.NameTable)

        DocumentNamespaces.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")

        Dim XPathNavigator = Document.CreateNavigator()

        Dim Namespaces = XPathNavigator.GetNamespacesInScope(XmlNamespaceScope.All)

        If Namespaces IsNot Nothing

            For Each [Namespace] In Namespaces

                DocumentNamespaces.AddNamespace([Namespace].Key, [Namespace].Value)
            Next
        End If
        'Fetch and load namespaces

        'Rule definitions that must be take from db.
        Dim Rules = New Dictionary(Of String, String) From {
                {"First Name", "/*[local-name()='ClinicalDocument'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='recordTarget'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='patientRole'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='patient'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='name'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='given'][namespace-uri()='urn:hl7-org:v3']"},
                {"Last Name", "/*[local-name()='ClinicalDocument'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='recordTarget'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='patientRole'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='patient'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='name'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='family'][namespace-uri()='urn:hl7-org:v3']"},
                {"Test", "/*[local-name()='ClinicalDocument'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='structuredBody'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='section'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3'][4]/*[local-name()='section'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='entry'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='act'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='entryRelationship'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='observation'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='value'][namespace-uri()='urn:hl7-org:v3'][1]/@xsi:type"},
                {"Code", "/*[local-name()='ClinicalDocument'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='structuredBody'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='section'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='section'][namespace-uri()='urn:hl7-org:v3'][1]/*[local-name()='code'][namespace-uri()='urn:hl7-org:v3'][1]/@code"},
                {"Esame", "/*[local-name()='ClinicalDocument'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='structuredBody'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='section'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='component'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='section'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='text'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='table'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='thead'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='tr'][namespace-uri()='urn:hl7-org:v3']/*[local-name()='th'][namespace-uri()='urn:hl7-org:v3']"}}
        'Rule definitions

        '
        For Each Rule In Rules

            Dim Node = Document.SelectSingleNode(Rule.Value, DocumentNamespaces)

            Dim Value = ""

            If Node IsNot Nothing Then

                Value = Node.InnerText
            End If

            Console.WriteLine(Rule.Key + ": " + Value)
        Next


        'For Each rule In Rules
        '    Dim node = Document.SelectNodes(rule.Value, DocumentNamespaces)
        '    Dim value = ""
        '    If node IsNot Nothing Then
        '        value = node.innertext
        '    End If
        'Next


        Console.ReadLine()
    Catch Exception As Exception

        Console.WriteLine(Exception.Message)

        Console.ReadLine()
    End Try
End Sub

最终模块

但我也有这样的人 second Xml

这里的问题是他的表通常比行多,因此对于他们来说,我想放置一个数据库,就像它们只为每一行分开一样,我想得到-name-code-td value-low-hight-datetime :

All those are in a single component

我得到的结果是: test

2 个答案:

答案 0 :(得分:0)

您的XML无效,因此我将其修改为格式正确的XML:

<root>
    <title>TOSSICOLOGIA D'ABUSO</title>
    <component>
        <section>
            <code code="31011" codeSystemName="Codifica Interna Laboratorio" displayName="Etanolo (urine)">
                <!--TRASCODIFICA ANALISI NON DISPONIBILE-->
            </code>
            <text>
                <paragraph>
                </paragraph>
                <table>
                    <thead>
                        <tr>
                            <th>Esame</th>
                            <th>Esito</th>
                            <th>Abnormal Flag</th>
                            <th>Unita di misura</th>
                            <th>Range di riferimento</th>
                            <th>Metodo</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>Etanolo (urine)</td>
                            <td>&lt; 0,01 g/l</td>
                            <td/>
                            <td/>
                            <td>fino a 0,35</td>
                            <td/>
                        </tr>
                    </tbody>
                </table>
                <footnote/>
                <paragraph>
                </paragraph>
                <!--Inizio Microbiologia sezione humane readable-->
                <!--Fine   Microbiologia sezione humane readable-->
            </text>
        </section>
    </component>
    <component>
        <section>
            <code code="32000" codeSystemName="Codifica Interna Laboratorio" displayName="Creatininuria">
                <!--TRASCODIFICA ANALISI NON DISPONIBILE-->
            </code>
            <text>
                <paragraph>
                    <content ID="ANLNOTE---2-2">Prova autenticità campione droghe</content>
                </paragraph>
                <table>
                    <thead>
                        <tr>
                            <th>Esame</th>
                            <th>Esito</th>
                            <th>Abnormal Flag</th>
                            <th>Unita di misura</th>
                            <th>Range di riferimento</th>
                            <th>Metodo</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>Creatininuria</td>
                            <td>193.0</td>
                            <td/>
                            <td>mg/dL</td>
                            <td>fino a 20: campione non idoneo
                                            (non utilizzabile ai fini medico legali)
                                            20 - 40: campione dubbio
                                            sup. a 40: campione idoneo
                                        </td>
                            <td/>
                        </tr>
                    </tbody>
                </table>
                <footnote/>
                <paragraph>
                </paragraph>
                <!--Inizio Microbiologia sezione humane readable-->
                <!--Fine   Microbiologia sezione humane readable-->
            </text>
        </section>
    </component>
</root>

您可以使用此代码来解析值。

Dim doc = New XmlDocument()
doc.Load("C:\Users\ShkelzenTarja\projekt\CDR_v3_1\CDR\test2.xml")
Dim components As XmlNodeList = doc.SelectNodes("root/component/section/text/table")

For c As Integer = 0 To components.Count - 1
    Dim th = components(c).SelectSingleNode("thead/tr").SelectNodes("th")
    Dim td = components(c).SelectSingleNode("tbody/tr").SelectNodes("td")

    For i As Integer = 0 To td.Count - 1
        Debug.WriteLine("component {0}: {1} => {2}", c, th(i).InnerText, td(i).InnerText)
    Next
Next

结果

component 0: Esame => Etanolo (urine)
component 0: Esito => < 0,01 g/l
component 0: Abnormal Flag => 
component 0: Unita di misura => 
component 0: Range di riferimento => fino a 0,35
component 0: Metodo => 
component 1: Esame => Creatininuria
component 1: Esito => 193.0
component 1: Abnormal Flag => 
component 1: Unita di misura => mg/dL
component 1: Range di riferimento => fino a 20: campione non idoneo
                                            (non utilizzabile ai fini medico legali)
                                            20 - 40: campione dubbio
                                            sup. a 40: campione idoneo

component 1: Metodo => 

答案 1 :(得分:0)

如果格式不正确,这里是读取XML的方法

exports.handler = (event, context, callback) => {
  const { request }  = event.Records[0].cf;
  const parts        = request.uri.split('/');
  const lastPart     = parts[parts.length - 1];
  const hasExtension = lastPart.includes('.');

  if (!hasExtension) {
    const newURI = request.uri.replace(/\/?$/, '/index.html');
    request.uri = newURI;
  }

  return callback(null, request);
};