如何使用xpath选择具有相同值的多个元素

时间:2017-09-21 08:55:39

标签: xml xpath

我需要使用OrderLines“电子邮件”选择所有ProductType。 是否有“where”条款。我必须使用xpath进行选择。 这是我的XML文档:

<InputOrder>
  <Order> 
	<OrderType>Change</OrderType> 
    <OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Email>          
          <ProductLine>Email</ProductLine>
          <ProductName>Email Service</ProductName>
          <ProductLevel>2</ProductLevel>
          <ProductType>EMAIL</ProductType>
          <ProductOperation>NoChange</ProductOperation>
        </Email>
      </Product>
      <Asset>        
        <ActivationStatus>Complete</ActivationStatus>
        <AssetStatus>Active</AssetStatus>
      </Asset>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Email>          
          <ProductLine>Email</ProductLine>
          <ProductName>Email</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>EMAIL</ProductType>
          <ProductOperation>NoChange</ProductOperation>          
        </Email>
      </Product>
      <Asset>        
        <ActivationStatus>ReadyForActivation</ActivationStatus>
        <AssetStatus>Active</AssetStatus>
      </Asset>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Access>
          <ProductLine>Access</ProductLine>
          <ProductName>Internet Access Service</ProductName>
          <ProductLevel>2</ProductLevel>
          <ProductType>INTERNETACCESS</ProductType>
          <ProductOperation>NoChange</ProductOperation>          
        </Access>
      </Product>
      <Asset>
        <ActivationStatus>Complete</ActivationStatus>
        <AssetStatus>Active</AssetStatus>
      </Asset>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
	<OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Itv>          
          <ProductLine>TV</ProductLine>
          <ProductName>Ethernet switch</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>LITVADDITIONAL</ProductType>
          <ProductOperation>NoChange</ProductOperation>          
        </Itv>
      </Product>
      <Asset>
        <ActivationStatus>Complete</ActivationStatus>
        <AssetStatus>Active</AssetStatus>
      </Asset>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>      
      <Product>
        <Internet>          
          <ProductLine>Internet</ProductLine>
          <ProductName>IC31</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>INTERNET</ProductType>
          <ProductOperation>Add</ProductOperation>         
        </Internet>
      </Product>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Internet>         
          <ProductLine>Internet</ProductLine>
          <ProductName>IC01</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>INTERNET</ProductType>
          <ProductOperation>Delete</ProductOperation>          
        </Internet>
      </Product>
      <Asset>
        <ActivationStatus>Complete</ActivationStatus>
        <AssetStatus>Active</AssetStatus>
      </Asset>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Itv>          
          <ProductLine>TV</ProductLine>
          <ProductName>Sport1 pakket</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>TVCHANNEL</ProductType>
          <ProductOperation>Add</ProductOperation>          
        </Itv>
      </Product>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Itv>
          <ProductLine>TV</ProductLine>
          <ProductName>Digitale tv-ontvanger met harddiskrecorder</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>TV</ProductType>
          <ProductOperation>Delete</ProductOperation>
        </Itv>
      </Product>
      <Asset>
        <ActivationStatus>Complete</ActivationStatus>
        <AssetStatus>Active</AssetStatus>
      </Asset>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Itv>
          <ProductLine>TV</ProductLine>
          <ProductName>Digitale tv-ontvanger</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>TV</ProductType>
          <ProductOperation>Delete</ProductOperation>          
        </Itv>
      </Product>
      <Asset>
        <ActivationStatus>Complete</ActivationStatus>
        <AssetStatus>Active</AssetStatus>
      </Asset>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>      
      <Product>
        <Engineer>          
          <ProductLine>Engineer</ProductLine>
          <ProductName>Omruilen NT</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>ACCESSENGINEER</ProductType>
          <ProductOperation>Add</ProductOperation>         
        </Engineer>
      </Product>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <OrderLine>
      <ServiceId>100001</ServiceId>
      <Product>
        <Engineer>
          <ProductLine>Engineer</ProductLine>
          <ProductName>Omruilen modem</ProductName>
          <ProductLevel>3</ProductLevel>
          <ProductType>ACCESSENGINEER</ProductType>
          <ProductOperation>Add</ProductOperation>          
        </Engineer>
      </Product>
      <OrderLineStatus>Open</OrderLineStatus>
    </OrderLine>
    <HardwareAlreadyDelivered>false</HardwareAlreadyDelivered>   
    <Leadtime>12</Leadtime>
    <DirectTerminationMailandUser>false</DirectTerminationMailandUser>    
    <SuppressCommunication>false</SuppressCommunication>
  </Order>
</InputOrder>

2 个答案:

答案 0 :(得分:1)

试试这个xpath:

//OrderLine[.//ProductType[text()='EMAIL']]

它非常类似于WHERE表达式。

您可以按特殊条件搜索所有//OrderLine。 在你的情况下,这种情况是内部的某个地方应该是productType,所以它是"//ProductType[text()='EMAIL']"。还应在其前添加点.,以通过OrderLine中的相对xpath搜索产品类型,而不是xml文件中的某个位置。

答案 1 :(得分:0)

只需将条件放入方括号:

D1

它在XPath中称为谓词

相关问题