Avatar billede mmkit Nybegynder
05. maj 2005 - 22:34 Der er 7 kommentarer og
1 løsning

samle data fra et XML skema, smart!

Hej,

jeg har et xml skema (i en .xml fil) der indeholder flere komplekse elementer med attributer.
eks:

<books ...>
- <book isbn="14-2849-402-5">
    <author>O.Olesen</author>
    <title>Opsange</title>
  </book>
  ...
  ...
<\books>

mit problem er nu at hente isbn, author og title ud. Skal man virkelig loade filen vha. XmlTextReader eller XmlReader og parse den (f.eks. vha. XmlNodeType), eller er der en lettere metode?
Avatar billede arne_v Ekspert
05. maj 2005 - 22:37 #1
Du kan ret nemt loade den ind i et XmlDOcument og finde det du skal bruge
med XPath udtryk.
Avatar billede arne_v Ekspert
05. maj 2005 - 22:38 #2
super simpelt eksempel som jeglavede til et andet spørgsmål:

using System;
using System.Xml;

class MainClass
{
    public static void Main(string[] args)
    {
        string xml = @"
<Sprog>
    <DK>
            <name>lblKonfig</name>
            <value>Konfigurationsstatus:</value>
    </DK>
</Sprog>";
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        XmlNode n1 = doc.SelectSingleNode("/Sprog/DK[name='lblKonfig']");
        XmlNode n2 = n1.SelectSingleNode("value");
        Console.WriteLine(n2.FirstChild.Value);
    }
}
Avatar billede arne_v Ekspert
05. maj 2005 - 22:38 #3
doc.LoadXml(xmlstreng);

kan erstattes af

doc.LoadXml(xmlfilnavn);

så det kræver kun en linie at læse din XML fil ind
Avatar billede nielle Nybegynder
06. maj 2005 - 09:08 #4
Ja, selvfølgelig er du nødt til at loade filen, og selvfølgelig er du nødt til at parse data; Det ville du jo også være hvis det havde været en ikke-xml baseret txt-fil. Rent faktisk er der mange ting som er nemmere når det netop er xml, og når man først har forstået de hemmelige besværgelser bag Xpath så er det nu heller ikke så omstædigt:


XmlDocument doc = new XmlDocument();
doc.Load(@"C:\ ... \books.xml");

XmlNodeList books = doc.SelectNodes("/books/book");
foreach (XmlNode book in books)
{
    string isbn = book.Attributes["isbn"].Value;
    Console.WriteLine("ISBN    : " + isbn);

    string authorSearch = string.Format("//book[@isbn='{0}']/author", isbn);
    XmlNode author = book.SelectSingleNode(authorSearch);
    Console.WriteLine("  Author : " + author.InnerText);

    string titleSearch = string.Format("//book[@isbn='{0}']/title", isbn);
    XmlNode title = book.SelectSingleNode(titleSearch);
    Console.WriteLine("  Title  : " + title.InnerText);
}
Avatar billede nielle Nybegynder
06. maj 2005 - 09:19 #5
Hvis du altid er sikker på at hver book-node har både en author-node og en title-node, og at de ligger som hhv. nr. 1 og nr. 2 kan det klares en smule simplere:

XmlDocument doc = new XmlDocument();

doc.Load(@"C:\ ... \book.xml");

XmlNodeList books = doc.SelectNodes("/books/book");
foreach (XmlNode book in books)
{
Console.WriteLine("ISBN    : " + book.Attributes["isbn"].Value);

XmlNodeList bookinfo = book.ChildNodes;

XmlNode author = bookinfo[0];
Console.WriteLine("  Author : " + author.InnerText);

XmlNode title = bookinfo[1];
Console.WriteLine("  Title  : " + title.InnerText);
}
Avatar billede mmkit Nybegynder
06. maj 2005 - 10:00 #6
Tak for alle svarene.

Jeg har brugt Nielle's kode, dog med en lille smule ændringe,
istedet for

XmlNodeList books = doc.SelectNodes("/books/book");
foreach (XmlNode book in books)

har jeg skrevet:

XmlElement elist = doc.DocumentElement;
foreach (XmlNode book in elist){

books.Count returnerede nemlig 0. Så Nielle der er point til dig, så smid et svar :)
Avatar billede nielle Nybegynder
06. maj 2005 - 10:21 #7
Ok. :^)
Avatar billede nielle Nybegynder
06. maj 2005 - 10:23 #8
Det lyder som om at books ikke har været din root-node som dit eksempel ellers viser. I stedet kunne du så skrive:

XmlNodeList books = doc.SelectNodes("//books/book");

Læg mærke til at der her er 2 slashes foran books.
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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