2011-04-12 64 views
1

我使用下面的代碼來解析我的XML文件:VB.NET讀取XML文件的煩惱

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 

問題的存在是,它似乎並沒有在所有的工作。它崩潰就行了:

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 _ 
       } 

錯誤是:型「System.Xml.XmlException」的第一個機會異常system.xml.dll的發生

類型的第一次機會異常「 System.Xml.XmlException'發生在System.Xml.dll中 ':'字符,十六進制值0x3A,不能包含在名稱中。 5

更新的代碼:

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> 

最新更新

如果我有這樣的:

<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> 

我只能似乎得到的第一組數據(data1,wide1)但不是s的Econd?

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

VB.NET具有內嵌XML常量。爲什麼使用'String'? – 2011-04-12 19:31:57

+0

另外,你是什麼意思「它崩潰」?請發佈例外。 – 2011-04-12 19:32:20

+2

也看看''。這是壞的。此外,包括「編碼」聲明在這一點上是沒有意義的。 – Tomalak 2011-04-12 19:34:09

回答

1

在你的代碼的任何類以上的頂部/命名空間聲明導入theref命名空間:

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

然後,你可以使用XML文本與選擇

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 

編輯

您需要Import您希望在XML文字中使用的每個名稱空間。所以你的進口現在應該是:

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

這將清理編譯錯誤。接下來,您還需要從查詢中刪除​​,因爲<theref:body>是它的兄弟,而不是孩子。當調試這些東西時,我也推薦總是使用ToList()。當你開始生產時,你可以爲了性能的原因刪除它(我通常不打擾)。

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

EDIT 2

下面是使用新的XML數據的完整代碼。當我運行它,我得到一個消息,說:「企業社會責任」

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 

編輯3

好了,你只給了我你的XML的一部分),所以我不得不做出一些不起來。這裏的技巧是getXMLData將是XElement,特別是<csr:custom_attribute>節點。因此,您需要返回到原始代碼並使用代碼Select New...

爲方便起見,我將您的XML字符串轉換爲原始XDocument,因爲所有連接都使其難以閱讀。 還記得,我的XML可能不完全符合你的,因爲你只給了我一部分。

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 
+0

似乎找不到任何東西。它跳過** Debug.Print(「{0}:{1}」,pupil.Name,pupil.TagID)**代碼。 – StealthRT 2011-04-12 21:34:53

+0

你正在使用VB2010,對吧?如果你創建了一個全新的Windows窗體應用程序,然後將上面的所有代碼複製到Form1.vb的內容中,它應該將'429:US1'踢出到立即窗口。這是不是發生? – 2011-04-12 21:52:07

+0

是的,我使用VB2010。但上面的代碼似乎仍然不起作用。 ** pupilList **一直說它的** 0 **。 – StealthRT 2011-04-13 12:24:32

1

1.Try與此,

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

2.Another解決方案與傳統的循環方式,在類的頂部

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

進口的命名空間。不是使用follwoing代碼來獲取值,

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

不能使用,當我使用**從學生在document.Descendants(「theref:theref-msg」)** – StealthRT 2011-04-12 20:10:16