Avatar billede jpi Mester
13. marts 2023 - 14:56 Der er 7 kommentarer og
1 løsning

Gyldig XML?

Hej

Jeg får denne XML, som jeg skal indlæse vha noget VB-kode, men jeg er i tvivl om XML-formatet er gyldigt, da DESG-tag'en findes 2 gange med 2 forskelligt indhold.

  <Record>
    <DESG>TEST</DESG>
    <NAME>HANSEN</NAME>
    <DESG>
      <TEXT>HAMMEL</TEXT2>
    </DESG>
  </Record>

Når jeg bruger en online kode-kreeringsside får den kun DESG med 1 gang som en classe der indeholder TEXT Dvs. at den ikke vil indlæse den første DESG-tag.

Er XML gyldig og i givet fald, hvordan klarer jeg det med klasserne, når indholdet kan være både en string og en anden klasse?
Avatar billede arne_v Ekspert
13. marts 2023 - 15:26 #1
Konstruktionen er gyldig XML.

Men hvis du skal læse den i VB.NET afhænger det meget af hvordan du læser den.

XmlDocument, XDocument og XmlReader vil ikke være et problem, da koden vil eksplicit håndtere det.

XmlSerializer vil nok være et problem.

Kan du uddybe lidt hvad du har brug for? Så kan jeg måske bixe et eksempel.
Avatar billede arne_v Ekspert
13. marts 2023 - 16:22 #2
<TEXT>HAMMEL</TEXT2>

duer naturligvis ikke, men jeg formoder at det er en slag fejl.
Avatar billede jpi Mester
13. marts 2023 - 16:37 #3
Jeg skal på en eller anden måde indlæse data til nogle klasser i min kode, så jeg kan arbejde med dem.
Har ikke koden ved mig lige nu, men mener bestemt at jeg bruger XMLserialize til de andre ting.
En klasse med navn record der indeholder en property name at typen string og et objekt med navnet RESG af typen RESG,
En klasse RESG der har en property Text af typen string og så endnu en string der holdser en RESG der ikke har "under"-tags. Men hvad skal den hedde for at det virker?
Avatar billede arne_v Ekspert
13. marts 2023 - 17:47 #4
XmlSerializer kan ikke klare at samme tag bruges til 2 forskellige typer.

Man kan naturligvis lave en wok around.


Imports System
Imports System.IO
Imports System.Linq
Imports System.Text.RegularExpressions
Imports System.Xml
Imports System.Xml.Linq
Imports System.Xml.Serialization

Namespace XmlFun
    Public Class Desg
        <XmlElement(ElementName := "TEXT")> _
        Public Property Text() As String
    End Class
    Public Class Record
        <XmlElement(ElementName := "DESG")> _
        Public Property Desg() As String
        <XmlElement(ElementName := "NAME")> _
        Public Property Name() As String
        <XmlElement(ElementName := "DESG2")> _
        Public Property Desg2() As Desg
    End Class
    Public Class Program
        Public Shared Sub Main(args As String())
            Dim xmlstr As String = "<Record>" & vbCr & vbLf & "    <DESG>TEST</DESG>" & vbCr & vbLf & "    <NAME>HANSEN</NAME>" & vbCr & vbLf & "    <DESG>" & vbCr & vbLf & "      <TEXT>HAMMEL</TEXT>" & vbCr & vbLf & "    </DESG>" & vbCr & vbLf & "  </Record>"
            Console.WriteLine(xmlstr)
            Dim doc As New XmlDocument()
            doc.LoadXml(xmlstr)
            Console.WriteLine(doc.DocumentElement.ChildNodes(0).FirstChild.Value)
            Console.WriteLine(doc.DocumentElement.ChildNodes(2).ChildNodes(0).FirstChild.Value)
            Dim xd As XDocument = XDocument.Parse(xmlstr)
            Console.WriteLine(xd.Root.Elements("DESG").ToArray()(0).Value)
            Console.WriteLine(xd.Root.Elements("DESG").ToArray()(1).Element("TEXT").Value)
            Dim ser As New XmlSerializer(GetType(Record))
            Dim r As Record = DirectCast(ser.Deserialize(New StringReader(Regex.Replace(xmlstr, "<DESG>(\s*<TEXT>.*</TEXT>\s*)</DESG>", "<DESG2>$1</DESG2>", RegexOptions.Singleline))), Record)
            Console.WriteLine(r.Desg)
            Console.WriteLine(r.Desg2.Text)
            Console.ReadKey()
        End Sub
    End Class
End Namespace


giver:


<Record>
    <DESG>TEST</DESG>
    <NAME>HANSEN</NAME>
    <DESG>
      <TEXT>HAMMEL</TEXT>
    </DESG>
  </Record>
TEST
HAMMEL
TEST
HAMMEL
TEST
HAMMEL
Avatar billede jpi Mester
14. marts 2023 - 13:23 #5
Tak.
Løsningen med at manipulere i xml-strengen er jeg dog ikke så glad for da det kan være ret store xml-filer.

Er der en mere "pæn" løsning, hvor man ikke bruger XmlSerializer?
Avatar billede arne_v Ekspert
14. marts 2023 - 14:05 #6
Så er der XmlDocument og XDocument og manuelt flytte over i properties på objekter i en collection.

Bemærk at disse også læser hele dokumentet ind i memory.

Med GB dokumenter skal man kigge på XmlReader, men så bliver det også meget besværligt.
Avatar billede jpi Mester
14. marts 2023 - 14:17 #7
OK, mange tak.
Jeg klarer den herfra.
Avatar billede arne_v Ekspert
14. marts 2023 - 16:28 #8
Min XML artikel (som har VB.NET eksempler) lever nu her:

https://www.vajhoej.dk/arne/articles/xmlproc.html
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester