2013-12-10 7 views
1

일부 노드 만있는 XML 파일이 있습니다. 여하튼 노드에는 많은 속성이 있습니다. 특정 키워드가 포함 된 속성을 쿼리하고 있습니다.XPath | 속성에 키워드를 찾는 표현식 만들기 - case-insensitiv

String expression = "/posts/row[@PostTypeId='1' and @*[contains(.,'Security')]]"; 

이 작업은 정상적으로 작동하지만 대문자 'S'와 정확히 일치하는 것을 찾습니다. 사용자가 키워드를 제공하게하고 소문자 만 사용할지 여부는 내 손에 달려 있지 않습니다. 내가하려는 것은

//posts/row[translate(@*, ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’, ‘abcdefghijklmnopqrstuvwxyz’)] 

모두를 키워드뿐만 아니라 XML 쪽에서 모두 소문자로 만들고 두 시도를 하나의 표현식으로 결합하는 것입니다.

이 내 시도하지만,

String expression = "/posts/row[@*[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" + keyword + "')]]"; 

누군가가 나를 제발 도와 드릴까요 작동하지? 내 시도에서 완전히 틀렸어? 사전에

감사합니다, 보도 내가 지금 일하고하게 모르는 다음

String expression = "/posts/row[@PostTypeId='1' and @*[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" + keyword + "')]]"; 

와 한편이 밖으로 정렬 수있는 것 같다


, 사람이 사람이 할 수 있도록 이걸 좀 털어 놓으 셨나요?

답변

0

당신은 매우 가깝지만 키워드를 소문자로 변환하는 것을 언급했지만 결코하지 마십시오. translate을 두 번 적용해야합니다. 더 나은 가독성을 위해 약간의 공백을 추가 할 수 있지만, 모든 일에 한 줄을 다시 (물론, 당신이 사용하는 문자열 연결에 의해 $keyword 교체) :

/posts/row[ 
    @PostTypeId='1' and @*[ 
    contains(
     translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 
     translate($keyword, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') 
    ) 
    ] 
] 

같은 비 ASCII-문자를 잊지하지 않도록하십시오 독일어 움라우트 또는 다른 액센트! 이러한 키워드를 구현하는 것은 귀찮을 수 있습니다. XPath 2.0은 유니 코드를 지원하는 lower-case(...)을 알고 있습니다.

+0

답변 해 주셔서 감사합니다. 당신은 키워드에 관하여 맞습니다. Java String 메서드를 사용하여 유사성을 검사하기 전에이 작업을 수행했다는 사실을 잊어 버렸습니다. – user3085123