2013-03-04 2 views
0

를 사용하여 XML 문자열에서 노드를 가져 오기 :나는 아래와 같은 문자열 XML을 정규식

<Query> 
    <Code>USD</Code> 
    <Description>United States Dollars</Description> 
    <UpdateTime>2013-03-04 02:27:33</UpdateTime> 
    <toUSD>1</toUSD> 
    <USDto>1</USDto> 
    <toEUR>2</toEUR> 
    <EURto>3</EURto> 
</Query> 

모든 텍스트는 공백없이 한 줄에 있습니다. 나는 정규식 패턴을 쓸 수 없다. 나는 <to 같이 시작하는 노드를 원한다. 예 : <toEUR>, <toUSD>.

이 패턴을 어떻게 작성해야합니까?

+3

([XML에 대한 정규식을 사용하지 마십시오] http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-self-contained-tags) – CAMOBAP

+2

어떤 언어입니까? 실제 XML 라이브러리 (또는 xpath, 또는 정규식 이외의 다른 것)를 사용하는 것이 좋습니다. –

+0

루비에서. 나를 위해 그것은 짧은 일반 텍스트, 그래서 나는 정규식을 사용하기로 결정했습니다. – user1931951

답변

-1

일반적인 합의가 정규식과 XML 등을 구문 분석가는 방법이 아니라고하지만,이 같은 트릭 수행해야합니다

<\s*(to[^>\s]+)[^>]*>([^<]+)<\s*/\s*\1\s*> 

루비 형식 :

/<\s*(to[^>\s]+)[^>]*>([^<]+)<\s*\/\s*\1\s*>/ 

일치 <toWatever>value</toWhatever>을 역 참조 그룹 1은 이름 (toWhatever)을 반환하고 역 참조 그룹 2는 값을 반환합니다.

노코 기리와 XPath는 기능 starts-with
0

:

require 'nokogiri' 
doc = Nokogiri::XML <<EOF 
<Query> 
    <Code>USD</Code> 
    <Description>United States Dollars</Description> 
    <UpdateTime>2013-03-04 02:27:33</UpdateTime> 
    <toUSD>1</toUSD> 
    <USDto>1</USDto> 
    <toEUR>2</toEUR> 
    <EURto>3</EURto> 
</Query> 
EOF 

doc.search('//*[starts-with(name(),"to")]').map &:to_s 
#=> ["<toUSD>1</toUSD>", "<toEUR>2</toEUR>"] 
관련 문제