2017-03-13 18 views
0

関連するいくつかの質問がありましたが、どれもそれを動作させる方法がありません。VB.Netの名前空間を含むXMLを解析します。

私はこのような構造を持つXMLファイルを持っている:私は、私はタグから名前空間を削除する場合に必要なデータを取得することができます

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfAssessmentItemTimed xmlns:xsi="http://a.b.c/" xmlns:xsd="http://d.e.f" xmlns="http://g.h.i"> 
    <AssessmentItemTimed> 
    <CustomerId>306</CustomerId> 
    <AssessmentId>1959060</AssessmentId> 
    <ExternalReference /> 
    <License>0577HJK</License> 
    <ChassisNumber>VF1KT1RG646667276</ChassisNumber> 
    <CostTraditional>2771.16</CostTraditional> 
    <CostCommercial>2771.16</CostCommercial> 
    <Kilometers>90957</Kilometers> 
    <TimeOrdered>2017-02-13T16:31:00.48</TimeOrdered> 
    <TimeClosed>2017-02-17T17:09:43.14</TimeClosed> 
    </AssessmentItemTimed> 
    <AssessmentItemTimed> 
    <CustomerId>306</CustomerId> 
    <AssessmentId>1959061</AssessmentId> 
    <ExternalReference /> 
    <License>0918HHM</License> 
    <ChassisNumber>VF1KT1RG646272649</ChassisNumber> 
    <CostTraditional>3293.33</CostTraditional> 
    <CostCommercial>3293.33</CostCommercial> 
    <Kilometers>158142</Kilometers> 
    <TimeOrdered>2017-02-13T16:31:01.73</TimeOrdered> 
    <TimeClosed>2017-02-16T21:05:38.98</TimeClosed> 
    </AssessmentItemTimed> 
</ArrayOfAssessmentItemTimed> 

を。これは私の現在のコードです:

Dim xmlnode As XmlDocument 
    Dim nodeList As XmlNodeList 
    Dim node As XmlNode 
    Dim nsmgr As XmlNamespaceManager 

    Try 

     xmlnode = New XmlDocument() 
     xmlnode.Load("file.xml") 
     nsmgr = New XmlNamespaceManager(xmlnode .NameTable) 

     nodeList = xmlnode.DocumentElement.SelectNodes("/sd:ArrayOfAssessmentItemTimed/sd:AssessmentItemTimed", nsmgr) 

     For Each xmlnode In nodeList 

      Dim plateNumber = xmlnode.SelectSingleNode("sd:License", nsmgr).InnerText 
      Dim chassisNumber = xmlnode.SelectSingleNode("sd:ChassisNumber", nsmgr).InnerText 
      Dim Kilometers = mlnode.SelectSingleNode("sd:Kilometers", nsmgr).InnerText 

      'test if works 
      MsgBox("License: " & plateNumber & vbCrLf _ 
         & "Chassis: " & chassisNumber & vbCrLf _ 
         & "Kms: " & Kilometers & vbCrLf & vbCrLf 
         ) 
     Next 
    Catch errorVariable As Exception 
     'Error trapping 
     MsgBox(errorVariable.ToString()) 
    End Try 

xmlnsの値を除外する正しい方法はありますか?私は本当にXmlNamespaceManagerを理解していないので、私は肯定的な結果を得ることができません。

ありがとうございます。

答えて

1

XPathクエリで使用するには、接頭辞 'sd'をXmlNamespaceManagerで登録する必要があります。 XPathは常に空の名前空間を持つ要素として、接頭辞なしの要素を扱う

.... 
nsmgr = New XmlNamespaceManager(New XmlNameTable()) 
nsmgr.AddNamespace("sd", "http://g.h.i"); 

nodeList = xmlnode.DocumentElement.SelectNodes("/sd:ArrayOfAssessmentItemTimed/sd:AssessmentItemTimed", nsmgr) 
.... 

、それはデフォルトの名前空間の概念を持っていません(XMLだけが持っている)、理由です:あなたはデフォルトの名前空間http://g.h.iにプレフィックスをマップしていることを確認しますここで接頭辞 'sd'を作成する必要があります。

+0

それは魔法のように動作します!主な問題は、デフォルトの名前空間ではなく、間違ったURLを使用しようとしていたようです。このヒントをありがとう!私はそれに取り組むことができます:-) – smtdev

0

さらに簡単な方法として、How to: Declare and Use XML Namespace Prefixesを確認できます。

Imports <xmlns="http://g.h.i"> 

とサンプル使用:

'' Dim xDoc = System.Xml.Linq.XDocument.Load("file.xml") 

Dim xDoc = <?xml version="1.0" encoding="utf-8"?> 
      <ArrayOfAssessmentItemTimed xmlns:xsi="http://a.b.c/" 
       xmlns:xsd="http://d.e.f" xmlns="http://g.h.i"> 
       <AssessmentItemTimed> 
        <License>0577HJK</License> 
        <ChassisNumber>VF1KT1RG646667276</ChassisNumber> 
        <Kilometers>90957</Kilometers> 
       </AssessmentItemTimed> 
       <AssessmentItemTimed> 
        <License>0918HHM</License> 
        <ChassisNumber>VF1KT1RG646272649</ChassisNumber> 
        <Kilometers>158142</Kilometers> 
       </AssessmentItemTimed> 
      </ArrayOfAssessmentItemTimed> 

For Each x In xDoc.<ArrayOfAssessmentItemTimed>.<AssessmentItemTimed> 

    MsgBox("License: " & vbTab & x.<License>.Value & vbLf & 
      "Chassis: " & vbTab & x.<ChassisNumber>.Value & vbLf & 
      "Kms:  " & vbTab & x.<Kilometers>.Value & vbLf) 
Next 
関連する問題