0

xml ファイルのバージョンを読み取ろうとしています。

<Order xsi:schemaLocation="urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01 order-v3.xsd urn:schemas-bossfed-co-uk:OP-Order-v1 OP-Order-v1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01">
  <OrderHead>
    <Schema>
      <Version>3.05</Version>
    </Schema>
    <Parameters>
      <Language>en-GB</Language>
      <DecimalSeparator>.</DecimalSeparator>
      <Precision>12.1</Precision>
    </Parameters>
    <OrderCurrency>
      <Currency Code="GBP">GB Pounds</Currency>
    </OrderCurrency>
  </OrderHead>

私が使用しようとしているコードは次のとおりです。

Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode

'Create the XML Document
m_xmld = New XmlDocument()

'Load the Xml file
m_xmld.Load(fileLocation)

'Show all data in your xml
MessageBox.Show(m_xmld.OuterXml)

'Get the list of name nodes
m_nodelist = m_xmld.SelectNodes("/Order/OrderHead/Schema")

For Each m_node In m_nodelist
    GetXmlVersion = m_node.Attributes.GetNamedItem("Version").Value
Next

しかし、それは何も引っ張りません。

私はそれを次のように変更しました:

Public Shared Function GetXmlVersion (ByVal fileLocation As String) As String
    Dim m_xmld As XmlDocument = New XmlDocument()
    m_xmld.Load (fileLocation)
    GetXmlVersion = m_xmld.SelectSingleNode ("/Order/OrderHead/Schema/Version").InnerText
End Function

そして私はただ得ます

NullReferenceException は Unhandled オブジェクト参照がオブジェクトのインスタンスに設定されていませんでした。

m_xmld.selectsinglenode が null であるため

4

2 に答える 2

2

最初の問題は、バージョンを子要素としてではなく属性として読み取ろうとしていることです。

2 つ目の問題は、XML ドキュメントにデフォルトの名前空間があることです。つまり、名前空間プレフィックスを明示的に指定する要素はありませんが、実際にはurn:schemas-basda-org:2000:purchaseOrder:xdr:3.01名前空間に属しています。お気づきかもしれませんが、このSelectSingleNodeメソッドは XPath を使用して一致するノードを見つけます。ご存じないかもしれませんが、XPath にデフォルトの名前空間を強制的に使用させる方法はありません。そのため、名前空間に属するすべてのノード名に対して正しい名前空間を指定する必要があります。公式 XPath 仕様から関連する段落を引用するには:

ノード テストの QName は、式コンテキストからの名前空間宣言を使用して展開名に展開されます。これは、xmlns で宣言されたデフォルトの名前空間が使用されないことを除いて、開始タグと終了タグの要素タイプ名に対して展開が行われるのと同じ方法です: QName にプレフィックスがない場合、名前空間 URI は null です(これは同じです)。属性名が展開される方法)。QName にプレフィックスがあり、式のコンテキストに名前空間宣言がない場合はエラーです。

したがって、次のようにする必要があります。

Public Shared Function GetXmlVersion(ByVal fileLocation As String) As String
    Dim xmld As XmlDocument = New XmlDocument()
    xmld.Load(fileLocation)
    Dim manager As XmlNamespaceManager = New XmlNamespaceManager(xmld.NameTable)
    manager.AddNamespace("n", xmld.DocumentElement.NamespaceURI)
    Return xmld.SelectSingleNode("/n:Order/n:OrderHead/n:Schema/n:Version", manager).InnerText
End Function

この例でxmld.DocumentElement.NamespaceURIは、ルート要素 ( ) の既定の名前空間 URI を返しますurn:schemas-basda-org:2000:purchaseOrder:xdr:3.01。「n」のプレフィックスを割り当てるため、XPath 内のすべての要素名に「n:」プレフィックスを付ける必要があります。

GetXmlVersion =また、行をに変更したことに気付くでしょうReturn。キーワードの使用Returnは、VB.NET で推奨される方法です。また、紛らわしいので、m_xmld変数の名前をに変更しました。xmld通常、VB の変数名の前にm_. ここではそうではありません。 xmldは単なるローカル メソッド変数です。

于 2012-07-06T12:51:06.480 に答える
0

バージョンは属性ではなく、スキーマの子要素です。

于 2012-07-06T09:01:22.853 に答える