2011-04-29 78 views
0

我试图创建和xpath表达式,它返回了一个节点的值,但是我发现我自己无法这样做,因为元素在另一个元素中它具有与根不同的命名空间。从另一个名称空间不同于另一个元素的元素检索一个元素

比如我想从以下XML检索InternalSystemId但传统的XML将无法正常工作

XPATH我试图使用

/SomeMessage[1] 
    /MessageDetails[1] 
     /PAYLOAD[1] 
     /Call-Name[1] 
      /Body[1] 
       /ActionToTake[1] 
        /Fields[1] 
        /InternalSystemId[1] 

XML我有

<?xml version="1.0" encoding="UTF-8"?> 
<SomeMessage> 
    <MessageDetails> 
     <FROM/> 
     <TO/> 
     <PAYLOAD> 
      <Call-Name 
      xmlns:ns0="http://www.mysite.com/interface/genericnamespace" 
      xmlns="http://www.mysite.com/interface/genericnamespace"> 
       <Header xmlns=""> 
        <Transaction> 
         <Mandatory> 
          <TransactionId>111111</TransactionId> 
         </Mandatory> 
         <System-Use-Only> 
          <Name>Receiver</Name> 
          <Someone>Customer</Someone> 
          <Something>OUT</Something> 
         </System-Use-Only> 
        </Transaction> 
       </Header> 
       <Body xmlns=""> 
        <ActionToTake> 
         <TransactionName>ActionToTake</TransactionName> 
         <Fields> 
          <InterfaceId>w00tie</InterfaceId> 
          <CustomerSystemId>555555</CustomerSystemId> 
          <InternalSystemId>4444444</InternalSystemId> 
          <SubmittedDate 
          >2011-04-14T12:00:00-00:00</SubmittedDate> 
          <EventType>A type</EventType> 
         </Fields> 
        </ActionToTake> 
       </Body> 
      </Call-Name> 
     </PAYLOAD> 
    </MessageDetails> 
</SomeMessage> 
+0

可能DUPLI [在C#中使用带默认命名空间的Xpath](http://stackoverflow.com/questions/585812/using-xpath-with-default-namespace-in-c) – 2011-04-29 21:36:30

回答

2

Call-Name该元件在其URI是命名空间“http://www.mysite.com/interface/generi cnamespace”。因此,你需要或者

  1. 通过名称中使用该命名空间中选择,或

  2. 使用一个命名空间无关的方法来访问 它。

元素位于与“根”(元素)不同的名称空间中的事实并不直接相关。

要做#1,您必须在XPath执行环境中声明命名空间的前缀;例如在XSLT样式表中,您可以放入xmnls:mysite="http://www.mysite.com/interface/genericnamespace"。然后你可以选择使用该前缀和元素名称的元素,例如

/SomeMessage[1]/MessageDetails[1]/PAYLOAD[1]/mysite:Call-Name[1]/Body[1]/ActionToTake[1]/Fields[1]/InternalSystemId[1] 

当然,你可以使用任何你喜欢的前缀。

要做#2,有几个选项。如果Call-Name元素没有兄弟姐妹,或者在其兄弟姐妹中有稳定的顺序,您可以用*替代它的名字。这样一来,XPath的将选择PAYLOAD[1]任何元素的孩子,无论其名称或命名空间:

/SomeMessage[1]/MessageDetails[1]/PAYLOAD[1]/*[1]/... 

另一种选择,如果你是勇敢和自信的输入XML的结构,就是用//来跳过该元素:

/SomeMessage[1]/MessageDetails[1]/PAYLOAD[1]//Body[1]/... 

如果您仍需要通过名称来进行测试,但不被命名空间,你可以使用local-name() =

/SomeMessage[1]/MessageDetails[1]/PAYLOAD[1]/*[local-name()='Call-Name']/Body[1]/... 
相关问题