2014-12-23 3 views
2

Я пытаюсь найти элемент с помощью contains.The проблема Если строка содержит одну цитату или двойную кавычку, ее трудно получить. Я использую этот xpath для соответствия непосредственно первому элементу. Есть ли лучший способ реализовать, не используя здесь выражение 'и'?Xpath using содержит

Xpath Используется: -

.//*[local-name()='GEOGRAPHY_TITLE'][contains(.,"APAC > Andaman Islands > test&'<,")and contains(., '"123')] 

XML Используется: -

<MST> 
<MST_GEOGRAPHY > 
       <GEOGRAPHY_TITLE>APAC &gt; Andaman Islands &gt; test&amp;'&lt;,\"123</GEOGRAPHY_TITLE> 
       <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID> 
       <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID> 
       <ACTIVE>1</ACTIVE> 
</MST_GEOGRAPHY> 
<MST_GEOGRAPHY > 
       <GEOGRAPHY_TITLE>APAC &gt; Andaman Islands &gt; test\"123&amp;'&lt;,\"123</GEOGRAPHY_TITLE> 
       <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID> 
       <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID> 
       <ACTIVE>1</ACTIVE> 
</MST_GEOGRAPHY> 
<MST_GEOGRAPHY > 
       <GEOGRAPHY_TITLE>hi</GEOGRAPHY_TITLE> 
       <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID> 
       <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID> 
       <ACTIVE>1</ACTIVE> 
</MST_GEOGRAPHY> 
</MST> 
+1

Что не так с использованием 'и'? Кроме того, подумайте о том, что делает каждую запись уникальной; является 'GEOGRAPHY_ID' каждого элемента' MST_GEOGRAPHY' уникальным (это должно быть, если это истинный идентификатор)? –

+1

Нет причин избежать цитаты в данных. Если я уйду из амперсанда в xpath, это сработает для меня. Если вы хотите избежать «и», вы можете использовать './/* [local-name() = 'GEOGRAPHY_TITLE'] [. eq "APAC> Андаманские острова> тест & '<, " 123"] 'или' .//*[local-name()='GEOGRAPHY_TITLE'][contains(.,"APAC> Андаманские острова> тест &' <, " 123 ")]' –

+0

Используете ли вы XPath 2.0 или XPathNavigator (вопрос отмечен обоими)? XPathNavigator поддерживает только XPath 1.0. – JLRishe

ответ

0

Это может быть стиль вещь, но я, вероятно, переписать XPath к этому:

//*:GEOGRAPHY_TITLE[contains(., "APAC > Andaman Islands > test&'<,")][contains(., '"123')] 

Таким образом, выбор элемента является абсолютным и статическим, а не оценкой функции local-name , это должно оказаться более эффективным. Поскольку вы уже знакомы с использованием нескольких предикатов в качестве способов ограничений, и мне кажется разумным использовать также несколько предикатов для содержимого, а не ключевое слово 'и'. Обычно (но не всегда), если вы сначала помещаете наиболее избирательный предикат, вы увидите лучшую производительность, чем сначала помещаете наименее избирательный предикат.

1

Можно выбрать разыскиваемый элемент (ов) без использования contains(), но только при строгом сравнении - как это:

//*/text()[1][. = concat("APAC > Andaman Islands > test&'<,\", '"123')] 

Объяснения:

Обратите внимание на использование стандартной функции XPath concat(), чтобы либо кавычки, либо апострофы могли использоваться, чтобы окружать части строки, которые их не содержат, и объединить эти части строки в полную строку.

Примечание: Данное решение использует только чистый XPath 1.0.

 Смежные вопросы

  • Нет связанных вопросов^_^