2017-09-21 65 views
0

我需要选择所有OrderLinesProductType“电子邮件”。 是否有一个'哪里'条款。我必须使用xpath进行选择。 这是我的XML文档:如何使用xpath选择多个具有相同值的元素

<InputOrder> 
 
    <Order> 
 
\t <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> 
 
\t <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>

回答

1

试试这个XPath:

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

这是非常相似的地方表达。

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

+0

这适用于选择一个具有文本“EMAIL”的元素(第一个元素),但不适用于包含文本的所有元素。 –

+0

此xpath将查找满足条件的所有元素。问题是你用什么工具来搜索它。可能你应该使用类似“findAll”等的东西 –

0

只要把条件为方括号:

/InputOrder/Order/OrderLine[Product/Email/ProductType="EMAIL"] 

它被称为谓词 XPath中。

相关问题