0

Closed the question as it wasn't an error - it just isn't possible

I am trying to return a range that contains all elements in a listobject/xmlmap where a sibling element meets some criteria (a particular elements values are not empty/blank/zero-length).

If I try to return the entire element of the xmlmap, I get the range returned correctly. However as soon as I add any criteria, the range object isn't set and I get an error.

エラーを特定するために名前空間の参照を全体的に削除しましたが、名前空間の宣言がなくてもエラーは残ります。以下のコードは、エラーを表示するために、私が作業しているものを大幅に簡略化したものです。

XML データ

<?xml version='1.0' encoding='UTF-8'?>
<ROOT>
  <RECORD>
    <ITEMA/>
    <ITEMB>RED</ITEMB>
  </RECORD>
  <RECORD>
    <ITEMA>A</ITEMA>
    <ITEMB>BLUE</ITEMB>
  </RECORD>
  <RECORD>
    <ITEMA>B</ITEMA>
    <ITEMB>GREEN</ITEMB>
  </RECORD>
</ROOT>

XSD を使用して Excel で XmlMap をセットアップする

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="ROOT" type="RootType"/>
<xs:complexType name="RootType">
    <xs:sequence>
        <xs:element name="RECORD" maxOccurs="unbounded">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="ITEMA"/>
                    <xs:element name="ITEMB"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>
</xs:schema>

作業用 VBA コード (述語なし)

Sub TestSUCCESS()

Dim rngSource As Range
Dim sSourceXPath As String

sSourceXPath = "/ROOT/RECORD/ITEMB"

Set rngSource = Sheet4.XmlDataQuery(sSourceXPath)
Debug.Print rngSource.Address

End Sub

動作しない VBA コード (述語付き)

Sub TestERROR()

Dim rngSource As Range
Dim sSourceXPath As String

sSourceXPath = "/ROOT/RECORD/ITEMA[text()[normalize-space()]]"

Set rngSource = Sheet4.XmlDataQuery(sSourceXPath)
If Not rngSource Is Nothing Then
    Debug.Print rngSource.Address
Else
    Debug.Print "ERROR: rngSource isn't set"        
End If

End Sub

次のxpathも使用してみました:

"/ROOT/RECORD/ITEMB[../ITEMA[string-length(text()) > 0]]"

何かを機能させるためだけに次のバリエーションがありますが、役に立ちません:

sSourceXPath = "/ROOT/RECORD/ITEMB[../ITEMA[.="A"]]"

私が提供した xPath の例はすべて、Altova XMLSpy 2005 で動作します。

私が間違っている場所について誰か提案を提供できますか?

4

1 に答える 1

0

xpatht の観点からは、あなたの試みは問題ありません。しかし、たとえば、TIMEA が空でない ITEMB を選択することをお勧めします。

"/ROOT/RECORD/ITEMB[normalize-space(../ITEMA)]" 

しかし、これはすべて Worksheet.XmlDataQuery では機能しません

(私の最善の推測)のため:http://msdn.microsoft.com/en-us/library/office/ff839982.aspx

XmlDataQuery メソッドを使用すると、特定のマップ データの存在を照会できます。マップ内のデータのクエリには使用できません。たとえば、その範囲の XPath が "/root/People[@Age="23"]/FirstName" であるマップされた範囲が存在することは有効です。この XPath ロケーション パスに対する XmlDataQuery クエリは、正しい範囲を返します。ただし、マップされた範囲の XPath 定義が異なるため、上記のマップされた範囲内で "Joe" を見つけることを期待する "/root/People[FirstName="Joe"]" のクエリは失敗します。

于 2013-05-09T14:13:19.280 に答える