2013-05-09 39 views
0

关闭的问题,因为它是不是一个错误 - 它只是无法无法使用XPath谓语时设置范围/关闭/

我试图返回一个包含一个的ListObject的所有元素的范围/ xmlmap其中兄弟元素符合某些条件(特定元素值不为空/空白/零长度)。

如果我尝试返回xmlmap的整个元素,我会得到正确返回的范围。然而,只要我添加任何标准,范围对象没有设置,我得到一个错误。

我已经删除了命名空间refrences遍历,尝试和固定错误,但即使没有命名空间声明,错误仍然存​​在。下面的代码是我正在使用的简化版本,以显示错误。

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用于建立XmlMap在Excel

<?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]]" 

还有folloving的变化只是为了得到任何工作,但无济于事:

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

所有的XPath实例我已经在Altova XMLSpy 2005工作。

任何人都可以提供任何关于我哪里出错的建议吗?

+0

我不认为关闭这个问题是适当的行动。也许用户用户可能有理智的问题。 – 2013-05-09 19:11:19

回答

0

从xpaht的角度来看,你的尝试是可以的。但我更喜欢用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查询将返回正确的范围。但是,查询“/ root/People [FirstName =”Joe“]”希望在上述映射范围内找到“Joe”将会失败,因为映射范围的XPath定义不同。

+0

你会如何建议我继续?你会将xml中的xml加载到MSXML6.0 DOM中吗?xpath /查询使用它的元素吗?还是会导致同一堵墙? – leejkennedy 2013-05-09 15:23:06

+0

我怀疑MSXML6.0 DOM会这样做。但我不确定这会对你有所帮助,因为我现在不知道你会缺少哪些Worksheet功能。因此,我认为你关闭了rngSource。 – 2013-05-09 15:32:44

+0

请在我以前的评论中将“嫌疑人”替换为“期望”。 ':-( – 2013-05-09 15:57:18