开发者

VB.NET reading XML file troubles

I am using the following code to parse a XML file of mine:

Dim xml As String = "<?xml version=""1.0"" encoding=""Windows-1252""?>" & _
                        "<theref:theref-msg xmlns:csr=""http://www.xxxxx.com/Schema/csr"" xmlns:theref=""http://www.xxxxx.com/Schema/theref"">" & _
                          "<theref:header>" & _
                            "<theref:eid />" & _
                            "<theref:reference_id>429</theref:reference_id>" & _
                            "<theref:sr_type_code>US1</theref:sr_type_code>" & _
                            "<theref:event_type_code>REQUEST</theref:event_type_code>" & _
                            "<theref:eai_event_code>DSR</theref:eai_event_code>" & _
                            "<theref:source_code>WORKS</theref:source_code>" & _
                            "<theref:target_code>APP</theref:target_code>" & _
                            "<theref:status_code />" & _
                            "<theref:details />" & _
                          "</theref:header>" & _
                        "</theref:theref-msg>"

    Dim document As XDocument = XDocument.Parse(xml)

    Dim pupils = From pupil In document.Descendants("theref:theref-msg") _
                 Select New With _
                 { _
                    .Name = pupil.Element("theref:reference_id").Value, _
                    .TagID = pupil.Element("theref:sr_type_code").Value _
                 }

    For Each pupil In pupils
        Debug.Print("{0}: {1}", pupil.Name, pupil.TagID)
    Next

The problem being is that it doesn't seem to work at all. It crashes on the line:

Dim pupils = From pupil In document.Descendants("csreai:csreai-msg") _
                 Select New With _
                 { _
                    .Name = pupil.Element("csreai:reference_id").Value, _
                    .TagID = pupil.Element("csreai:sr_type_code").Value _
                 }
开发者_高级运维

ERROR is: A first chance exception of type 'System.Xml.XmlException' occurred in System.Xml.dll

A first chance exception of type 'System.Xml.XmlException' occurred in System.Xml.dll The ':' character, hexadecimal value 0x3A, cannot be included in a name. 5

UPDATED CODE:

Dim xml As String = "<?xml version=""1.0"" encoding=""Windows-1252""?>" & _
                    "<theref:theref-msg xmlns:csr=""http://www.xxxxx.com/Schema/csr"" xmlns:theref=""http://www.xxxxx.com/Schema/theref"">" & _
                      "<theref:header>" & _
                        "<theref:eid />" & _
                        "<theref:reference_id>429</theref:reference_id>" & _
                        "<theref:sr_type_code>US1</theref:sr_type_code>" & _
                        "<theref:event_type_code>REQUEST</theref:event_type_code>" & _
                        "<theref:eai_event_code>DSR</theref:eai_event_code>" & _
                        "<theref:source_code>WORKS</theref:source_code>" & _
                        "<theref:target_code>APP</theref:target_code>" & _
                        "<theref:status_code />" & _
                        "<theref:details />" & _
                      "</theref:header>" & _
                      "<theref:body>" & _
                        "<csr:document>" & _
                          "<csr:header>" & _
                            "<csr:system>CSR</csr:system>" & _
                            "<csr:doc_name>FULLSR</csr:doc_name>" & _
                            "<csr:version>3.1</csr:version>" & _
                            "<csr:dml_event>UPDATE</csr:dml_event>" & _
                          "</csr:header>" & _
                    "</csr:document></theref:body></theref:theref-msg>"

Dim xmlb = From getXMLData In document.<theref:theref-msg>.<theref:header>.<theref:body>.<csr:document>.<csr:header>

Newest UPDATE

What if i have this:

   <csr:custom_attributes>
      <csr:custom_attribute>
        <csr:type_code>
          <csr:value>data1</csr:value>
        </csr:type_code>
        <csr:group_code>
          <csr:value>wide1</csr:value>
        </csr:group_code>
      </csr:custom_attribute>
      <csr:custom_attribute>
        <csr:type_code>
          <csr:value>data2</csr:value>
        </csr:type_code>
        <csr:group_code>
          <csr:value>wide2</csr:value>
        </csr:group_code>
      </csr:custom_attribute>
   </csr:custom_attributes>

I can only seem to get the first set of data (data1, wide1) but not the second?

   xmlDATA = (From getXMLData In document.<theref:csreai-msg>.<theref:body>.<csr:document>.<csr:service_request>.<csr:custom_attributes>.<csr:custom_attribute>).ToList()


At the top of your code above any class/namespace declarations import the theref namespace:

Imports <xmlns:theref="http://www.xxxxx.com/Schema/theref">

Then you can just use XML literals to select with

Option Explicit On
Option Strict On

Imports <xmlns:theref="http://www.xxxxx.com/Schema/theref">

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim xml As String = "<?xml version=""1.0"" encoding=""Windows-1252""?>" & _
                        "<theref:theref-msg xmlns:csr=""http://www.xxxxx.com/Schema/csr"" xmlns:theref=""http://www.xxxxx.com/Schema/theref"">" & _
                          "<theref:header>" & _
                            "<theref:eid />" & _
                            "<theref:reference_id>429</theref:reference_id>" & _
                            "<theref:sr_type_code>US1</theref:sr_type_code>" & _
                            "<theref:event_type_code>REQUEST</theref:event_type_code>" & _
                            "<theref:eai_event_code>DSR</theref:eai_event_code>" & _
                            "<theref:source_code>WORKS</theref:source_code>" & _
                            "<theref:target_code>APP</theref:target_code>" & _
                            "<theref:status_code />" & _
                            "<theref:details />" & _
                          "</theref:header>" & _
                        "</theref:theref-msg>"

        Dim document As XDocument = XDocument.Parse(xml)

        Dim pupils = From pupil In document.<theref:theref-msg>.<theref:header>
                     Select New With
                            {
                                .Name = pupil.<theref:reference_id>.Value,
                                .TagID = pupil.<theref:sr_type_code>.Value
                            }


        Dim pupilList = pupils.ToList()

        For Each pupil In pupilList
            Debug.Print("{0}: {1}", pupil.Name, pupil.TagID)
        Next
    End Sub
End Class

EDIT

You need to Import every namespace that you want to use in an XML literal. So your import should now be:

Imports <xmlns:theref="http://www.xxxxx.com/Schema/theref">
Imports <xmlns:csr="http://www.xxxxx.com/Schema/csr">

That will clean up the compilation errors. Next you also need to remove <theref:header> from the query since <theref:body> is a sibling to it and not a child. When debugging these kind of things I also recommend always using ToList(). When you got to production you can remove that for performance reasons (I usually don't bother).

Dim xmlb = (From getXMLData In document.<theref:theref-msg>.<theref:body>.<csr:document>.<csr:header>).ToList()

EDIT 2

Here's the full code using your new XML data. When I run it I get a messagebox that says "CSR"

Option Explicit On
Option Strict On

Imports <xmlns:theref="http://www.xxxxx.com/Schema/theref">
Imports <xmlns:csr="http://www.xxxxx.com/Schema/csr">

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim xml As String = "<?xml version=""1.0"" encoding=""Windows-1252""?>" & _
                     "<theref:theref-msg xmlns:csr=""http://www.xxxxx.com/Schema/csr"" xmlns:theref=""http://www.xxxxx.com/Schema/theref"">" & _
                       "<theref:header>" & _
                         "<theref:eid />" & _
                         "<theref:reference_id>429</theref:reference_id>" & _
                         "<theref:sr_type_code>US1</theref:sr_type_code>" & _
                         "<theref:event_type_code>REQUEST</theref:event_type_code>" & _
                         "<theref:eai_event_code>DSR</theref:eai_event_code>" & _
                         "<theref:source_code>WORKS</theref:source_code>" & _
                         "<theref:target_code>APP</theref:target_code>" & _
                         "<theref:status_code />" & _
                         "<theref:details />" & _
                       "</theref:header>" & _
                       "<theref:body>" & _
                         "<csr:document>" & _
                           "<csr:header>" & _
                             "<csr:system>CSR</csr:system>" & _
                             "<csr:doc_name>FULLSR</csr:doc_name>" & _
                             "<csr:version>3.1</csr:version>" & _
                             "<csr:dml_event>UPDATE</csr:dml_event>" & _
                           "</csr:header>" & _
                     "</csr:document></theref:body></theref:theref-msg>"

        Dim document As XDocument = XDocument.Parse(xml)

        Dim xmlb = (From getXMLData In document.<theref:theref-msg>.<theref:body>.<csr:document>.<csr:header>).ToList()
        MsgBox(xmlb.<csr:system>.Value)

    End Sub
End Class

EDIT 3

Well, you only gave me part of your XML ;) so I had to make some of it up. The trick here is that getXMLData will be an XElement, specifically a <csr:custom_attribute> node. With that you need to go back to your original code and use the Select New... code.

For convenience I converted your XML string to a raw XDocument because all of the concats was making it hard to read. Remember, my XML might not exactly match yours because you only gave me a portion.

Option Explicit On
Option Strict On

Imports <xmlns:theref="http://www.xxxxx.com/Schema/theref">
Imports <xmlns:csr="http://www.xxxxx.com/Schema/csr">

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim document = <?xml version="1.0" encoding="Windows-1252"?>
                       <theref:theref-msg xmlns:csr="http://www.xxxxx.com/Schema/csr" xmlns:theref="http://www.xxxxx.com/Schema/theref">
                           <theref:body>
                               <csr:document>
                                   <csr:service_request>
                                       <csr:custom_attributes>
                                           <csr:custom_attribute>
                                               <csr:type_code>
                                                   <csr:value>data1</csr:value>
                                               </csr:type_code>
                                               <csr:group_code>
                                                   <csr:value>wide1</csr:value>
                                               </csr:group_code>
                                           </csr:custom_attribute>
                                           <csr:custom_attribute>
                                               <csr:type_code>
                                                   <csr:value>data2</csr:value>
                                               </csr:type_code>
                                               <csr:group_code>
                                                   <csr:value>wide2</csr:value>
                                               </csr:group_code>
                                           </csr:custom_attribute>
                                       </csr:custom_attributes>
                                   </csr:service_request>
                               </csr:document>
                           </theref:body>
                       </theref:theref-msg>

        Dim xmlDATA = (
                        From getXMLData In document.<theref:theref-msg>.<theref:body>.<csr:document>.<csr:service_request>.<csr:custom_attributes>.<csr:custom_attribute>
                        Select New With {.TypeCode = getXMLData.<csr:type_code>.<csr:value>.Value, .GroupCode = getXMLData.<csr:group_code>.<csr:value>.Value}
                      ).ToList()
        For Each X In xmlDATA
            Trace.WriteLine(X.TypeCode & ":" & X.GroupCode)
        Next
    End Sub
End Class


1.Try with this,

       document.Descendants("{http://www.xxxxx.com/Schema/theref}theref-msg").FirstOrDefault

2.Another solution with traditional looping approach,

     Imports <xmlns:ns='http://www.xxxxx.com/Schema/theref'> 

import namespace on top of the class. than use follwoing code to get the values,

         For Each header As XElement In document.<ns:theref-msg>.<ns:header>.<ns:reference_id>
             dim something = header.Value
         Next
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜