2011-04-12 65 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