Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ανάγνωση XML αρχείου

Îåêßíçóå áðü ôï ìÝëïò JohnL. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 30-05-2008, 19:13. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-10-2007, 22:54 36530

    Ανάγνωση XML αρχείου

    Έχω το παρακάτω αρχείο. Θέλω να μπορώ να διαβάζω το κάθε element με το όνομά του. Δηλαδή, αν χρειαστώ το id και το field1 του 1ου item, ποιός είναι ο προτιμότερος τρόπος να το διαβάσω?

    <
    list>
        <item>
            <id>1</id>
            <title>abcdef</title>
            <data>
                <field1>qwerty</field1>
                <field2>uiop</field2>
            </data>
        </item>
        <item>
        ...
        ...
    </list>


  •  23-10-2007, 23:52 36534 σε απάντηση της 36530

    Απ: Ανάγνωση XML αρχείου

    Πρέπει να δώσεις περισσότερες πληροφορίες σχετικά με το σενάριό σου.

    Ρίξε μια ματιά στα παρακάτω:

    http://samples.gotdotnet.com/quickstart/howto/doc/Xml/ReadXMLFile.aspx

    http://support.microsoft.com/kb/307548

    Πάντως γενικά, θα πρέπει να χρησιμοποιήσεις ένα XPath expression που θα λέει "πάρε το parent element από το element ID που έχει value 1"


    Vir prudens non contra ventum mingit
  •  24-10-2007, 01:34 36538 σε απάντηση της 36534

    Απ: Ανάγνωση XML αρχείου

    Τι άλλη πληροφορία χρειάζεται να δώσω?

    Προσπάθησα να το υλοποιήσω χρησιμοποιώντας DataSet... Εκεί που κόλλησα είναι στο διάβασμα των field1, field2, καθώς ανήκουν σε άλλο πίνακα... Γίνεται κάπως να διαβάσω αυτά?

    Dim ds As DataSet = New DataSet()

    ds.ReadXml("c:\test.xml")
    For Each row As DataRow In ds.Tables("item").Rows
        Dim newItem As New ListViewItem
        newItem.Tag = row.Item("id").ToString
        newItem.SubItems.Add(row.Item("title").ToString)
        ' εδώ θέλω να διαβάσω το field1 kai to field2
        lsvComics.Items.Add(newItem)
    Next

  •  24-10-2007, 09:01 36542 σε απάντηση της 36538

    Απ: Ανάγνωση XML αρχείου

    Στο πρώτο link που σου έδωσα έχει διάφορες τεχνικές. Για παράδειγμα, κοίτα αυτό που λέει "How Do I...Query XML with an XPath expression?"


    Vir prudens non contra ventum mingit
  •  24-10-2007, 11:52 36549 σε απάντηση της 36542

    Απ: Ανάγνωση XML αρχείου

    Ναι, τα κοίταξα τα link και εφαρμόζουν σε γενικές γραμμές στην περίπτωση μου, αλλά ήθελα να το υλοποίησω με Dataset αν γίνεται, επειδή μου δίνουν μεγαλύτερη ευελιξία (και ίσως και καλύτερη απόδοση)...

    Γίνεται να χρησιμοποιήσω Dataset?
  •  24-10-2007, 16:04 36555 σε απάντηση της 36549

    Απ: Ανάγνωση XML αρχείου

    Γίνεται πως δεν γίνεται. Στην συγκεκριμένη περίπτωση όμως το DataSet δεν δίνει μεγαλύτερη ευελιξία καθώς θα πρέπει να ορίσεις εκ των υστέρων ένα DataRelation object που να συνδέει τους δύο πίνακες που δημιουργούνται μέσα στο DataSet ώστε να μπορείς για κάθε DataRow του πρώτου να πάρεις τα child rows (με την GetChildRows) του δεύτερου. Επιπρόσθετα, αυτό το XML αρχείο δεν περιέχει επαρκείς πληροφορίες (metadata) ώστε να έχεις εύκολα στη χρήση ονόματα εσωτερικά στους πίνακες. Ο δεύτερος πίνακας μάλλον θα ονομάζεται "Data" με πεδία "Field1" και "Field2". Καθόλου πρακτικό. Εν κατακλείδι, είναι σαν να προσπαθείς να βιδώσεις μια βίδα με σφυρί. Use the right tool...


    Vir prudens non contra ventum mingit
  •  30-05-2008, 12:39 42537 σε απάντηση της 36530

    Απ: Ανάγνωση XML αρχείου

    και εγώ χρειάζομαι να διαβάσω ένα παρόμοιο xml, αλλά δεν δουλεύει!

     'LOADS AN XML FILE VIA IT'S STRING PATH AND RETURNS TRUE
        'IF THE READING WAS SUCCESSFUL, OTHERWISE FALSE IS RETURNED
        Private Function loadPhoneBook(ByVal iFileName As String) As Boolean

            'DECLARATIONS NECESSARY FOR READING AND NAVIGATING
            'XML DOCUMENTS
            Dim pXldDocument As New XmlDocument()
            Dim pXpnNavigator As XPathNavigator
            Dim pXniIterator As XPathNodeIterator
            Dim pXniIterator2 As XPathNodeIterator

            Dim firstIterator As Integer
            Dim arxiko As String = TextBox1.Text
            Dim found As Boolean = False

         

            'THIS SECTION IS PLACED WITHIN A TRY BLOCK JUST
            'IN CASE THERE ARE ANY READING ERRORS, THIS
            'WAY WE KNOW IF THE FILE WAS READ OKAY OR NOT
            Try

                'LOAD THE XML DOCUMENT AND INITIALIZE THE NAVIGATOR
                Call pXldDocument.Load(iFileName)
                pXpnNavigator = pXldDocument.CreateNavigator

                'NAVIGATE TO THE FIRST CONTACT IN THE DOCUMENT USING IT'S
                'XPATH LOCATION
                pXniIterator = pXpnNavigator.Select("list/skill")
                While pXniIterator.MoveNext()

                    'DECLARE VARIABLES FOR TEMPORARILY STORING THE CURRENT
                    'CONTACT INFORMATION

                    Dim buffTime As String

                    Dim buffName As String

                    '----------

                    'ENUMERATE THROUGH EACH CONTACT TAG
                    Call pXniIterator.Current.MoveToFirstAttribute()
                    Do
                        If found = True Then
                            Exit While
                        End If

                        'ENUMERATE THROUGH EACH CONTACT CHILD TAG
                        Call pXniIterator.Current.MoveToFirstChild()

                        Do
                        
                            'STORE THE DATA FOR EACH CHILD TAG IN
                            'THE TEMPORARY VARIABLES
                            Select Case pXniIterator.Current.Name
                                Case "time"
                                    buffTime = pXniIterator.Current.Value
                                    BuffTimeText.Text = pXniIterator.Current.Value
                                Case "name"
                                    buffName = pXniIterator.Current.Value
                                    TextBox1.Text = pXniIterator.Current.Value
                                    If arxiko = pXniIterator.Current.Value Then
                                        found = True
                                        firstIterator = pXniIterator.CurrentPosition
                                    End If
                                Case "id"
                                    TextBox2.Text = pXniIterator.Current.Value
                                Case "target"
                                    TargetTypeText.Text = pXniIterator.Current.Value
                            End Select

                                 Loop Until (Not pXniIterator.Current.MoveToNext)
                   
                    Loop Until (Not pXniIterator.Current.MoveToNextAttribute())
              

                End While

            
            Catch ex As Exception

                        MsgBox(Err.Description)

            End Try


    και το xml δείχνει έτσι

    <?xml version="1.0" encoding="utf-8" ?>
    <list>
    <skill id="367" levels="1" name="Dance of Medusa">
      <set name="element" val="4"/> <!-- Earth -->
      <set name="magicLvl" val="77"/>
      <set name="mpConsume" val="53"/>
      <set name="weaponsAllowed" val="512"/>
      <set name="power" val="40"/>
      <set name="skillRadius" val="150"/>
      <set name="target" val="TARGET_AURAA"/>
      <set name="skillType" val="PARALYZE"/>
      <set name="operateType" val="OP_ACTIVE2"/>
      <set name="castRange" val="-1"/>
      <set name="effectRange" val="-1"/>
      <set name="hitTime" val="2000"/>
      <set name="reuseDelay" val="120000"/>
      <for>
        <effect count="1" name="Petrification" time="30" val="0"/>
      </for>
    </skill>

    </list>

    πως μπορώ να να πάρω την τιμή του time που βρίσκεται μέσα στο for?

    με το κώδικα αυτό μπορώ να πάρω ΜΟΝΟ αυτό
    <skill id="367" levels="1" name="Dance of Medusa">


    -------------

    θέλω να μπορώ να του λέω φέρε μου το time οπου το name = "Dance of Medusa"

    σε vb παρακαλώ αν ξέρετε θα με βοηθούσατε. κανένας δεν έχει παρόμοιο sample

    To 2007 tha ta poume stin agora :)
  •  30-05-2008, 19:13 42543 σε απάντηση της 42537

    Απ: Ανάγνωση XML αρχείου

    Samples για το XPath υπάρχουν πολλά, απλά πρέπει να καταλάβεις τί είναι αυτό που ζητάς για να ψάξεις για το κατάλληλο sample. Εδώ προσπαθείς να βρεις ένα node κάτω από ένα άλλο το οποίο έχει ένα συγκεκριμένο attribute και να επιστρέψεις μόνο ένα συγκεκριμένο attribute από αυτό το node. Το XPath query που το κάνει αυτό είναι @"//skill[@name='Dance of Medusa']/for/effect/@time και ο κώδικας:

    XmlDocument doc = new XmlDocument();
    doc.Load("XMLFile1.xml");
    XPathNavigator navigator = doc.CreateNavigator();
    XPathNavigator node = navigator.SelectSingleNode(@"//skill[@name='Dance of Medusa']/for/effect/@time");

    Console.WriteLine(node.Value);

    Αυτό που έπρεπε να ψάξεις είναι πως συντάσσεται ένα XPath query. Όσο για τη γλώσσα, τα περισσότερα βιβλία και παραδείγματα είναι γραμμένα σε C# οπότε καλό είναι να μπορείς τουλάχιστον να τα διαβάσεις. Σπάνια θα βρεις κάποιο άρθρο, βιβλίο ή sample το οποίο να υπάρχει σε VB και όχι σε C#.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems