1

名前空間付きxmlからノードを取得することに関して質問があります。クエリでxmlの単一の要素を指定する限り、一致するすべての要素を取得でき、それらの子を反復処理できます。より詳細なクエリを指定して単一の一意の要素を取得しようとすると、問題が発生します。

テストに使用しているXMLファイル

<?xml version="1.0" encoding="utf-8"?>
<<MTConnectStreams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mtconnect.org:MTConnectStreams:1.2 http://mtconnect.org/schemas/MTConnectStreams_1.2.xsd" xmlns="urn:mtconnect.org:MTConnectStreams:1.2">
  <Streams>
    <Samples>
      <Position dataItemId="xs4" timestamp="2012-11-29T12:30:19Z" sequence="1718269" name="x_pos_cmd" subType="COMMANDED" units="MILLIMETER">1</Position>
      <Position dataItemId="xs5" timestamp="2012-11-29T12:30:19Z" sequence="1718270" name="x_pos_act" subType="ACTUAL" units="MILLIMETER">2</Position>
      <Position dataItemId="xs4" timestamp="2012-11-29T12:30:19Z" sequence="1718269" name="y_pos_cmd" subType="COMMANDED" units="MILLIMETER">3</Position>
      <Position dataItemId="xs4" timestamp="2012-11-29T12:30:19Z" sequence="1718269" name="y_pos_act" subType="COMMANDED" units="MILLIMETER">4</Position>
      <Position dataItemId="xs4" timestamp="2012-11-29T12:30:19Z" sequence="1718269" name="z_pos_cmd" subType="COMMANDED" units="MILLIMETER">5</Position>
    </Samples>
    <Condition>
      <Unavailable dataItemId="xc1" type="POSITION" timestamp="2012-11-27T23:19:40Z" sequence="7" name="x_cond_pos">UNAVAILABLE</Unavailable>
      <Unavailable dataItemId="xc2" type="LOAD" timestamp="2012-11-27T23:19:40Z" sequence="8" name="x_cond_load">UNAVAILABLE</Unavailable>
    </Condition>
  </Streams>
</MTConnectStreams>

次のコードが与えられます:

Dim xIt As XPathNodeIterator
Dim xDoc As XmlDocument = New XmlDocument
xDoc.Load("c:\Download\Test.xml")
Dim xNav As XPathNavigator = xDoc.CreateNavigator
Dim nsMgr = New XmlNamespaceManager(xNav.NameTable)
nsMgr.AddNamespace("ns", "urn:mtconnect.org:MTConnectStreams:1.2")

sQuery = "//ns:Samples"
xIt = xNav.Select(sQuery, nsMgr)
MsgBox(xIt.Count.ToString)

When sQuery = "//ns:Samples" (1 result)
When sQuery = "//ns:Position" (5 results)
When sQuery = "//ns:Samples/Position (0 results  why?)
When sQuery = "//ns:Samples/Position[@name='x_pos_act'] (0 results)
When sQuery = "//ns:Position[@name='x_pos_act']" (0 results)
When sQuery = "//ns:Position/[@name='x_pos_act']" (0 results)

などなど。クエリが複数のノード名である場合は常に、結果が得られません。より詳細なクエリを指定する方法がわかりません。

4

1 に答える 1

1

を使用して動作するはずです//ns:Samples/ns:Position

XPathのAfaikでは、各サブパートで名前空間プレフィックスを指定する必要があります。これは属性にも当てはまります!

だから試してみてください:

When sQuery = "//ns:Samples"
When sQuery = "//ns:Position"
When sQuery = "//ns:Samples/ns:Position
When sQuery = "//ns:Samples/ns:Position[@ns:name='x_pos_act']
When sQuery = "//ns:Position[@ns:name='x_pos_act']"
When sQuery = "//ns:Position/[@ns:name='x_pos_act']"

名前空間を考慮したくない場合は、@*[local-name()='Samples']構文を使用することもできます。これにより、すべての名前空間が無視され、ノード名自体のみがチェックされます。

于 2013-03-14T15:20:57.133 に答える