2009-10-19 8 views
2

나는 코뿔소 (환희)에서 일하고 있어요, 나는/처리하는 다음과 같은 구조를 가진 XML을 구문 분석 할 수있어 :JavaScript/Rhino : E4X 쿼리에서 정규 표현식을 사용하여 특정 노드 만 선택할 수 있습니까?

난 단지 모든 "foo는"노드를 얻으려면
<root> 
<row> 
<foo-1 /> 
<foo-2 /> 
<foo-3 /> 
<foo-4 /> 
... 
<bar-1 /> 
<bar-2 /> 
<bar-3 /> 
<bar-4 /> 
... 
<something-else-1 /> 
<something-else-2 /> 
</row> 
</root> 

, 사용을 피하는 가능한 경우 루프 수를 늘리십시오. 내가 좋아하는 somenthing을 노력했습니다 :

xml.row.(new RegExp("foo[1-4]").test())) 

과 같은 라인의 약간의 변화 만이 작동하지 않습니다. 거기에 어떤 E4X 구문/방법이 완료 할 수 있나요 ?? 나는 잠시 동안 인터넷 검색을 해왔다. ECMAS 문서를 읽었지 만, 나는 이것을 할 수 없다.

미리 감사드립니다.

답변

1
xml.row.*.(/foo-[1-4]/.test(function::localName())) 
+0

Firebug 콘솔에서는 작동하지만 Mirth에서는 작동하지 않는 환경에서 작동합니다. function:: 네임 스페이스는 허용되지 않습니다. 스크립트 유효성 검사기를 사용할 때 구문 오류가 발생하기 때문에 허용되지 않습니다.또한 필터에서 name() 또는 localName()을 사용하려고하면 참조 오류가 발생하므로 범위 문제라고 생각합니다. 정말이 솔루션이 마음에 들었고 정확히 내가 찾고 있었던 것이기 때문에 수치 스럽습니다. ( –

+0

그렇다면 E4X를 사용하는 자바 스크립트를 Mirth에 의해 검사되지 않은 다른 파일에 넣을 수 있습니다. 나쁜,하지만 유일한 다른 옵션입니다.)'eval'을 사용하십시오. –

+0

또한 적어도 "E4X 구문/방법이 있습니까?"라는 질문에 대한 응답을 업데이트 할 수 있습니까? –

0

이것은 당신이 그것을 할 수있는 방법이지만, 코뿔소에서 작동하지 않습니다 지금은

xml.row.*.(/foo-[1-4]/.test(name())) // or localName() 

, 지금까지의 내가 아는 한, 당신은 루프를 사용해야합니다.

[foo for each (foo in xml.row.*) if (/foo-[1-4]/.test(foo.name()))] 

그것은 여전히 ​​루프를 사용하지만, 그것은 : 당신이 된 XMLList 대신 배열을 받고 신경 쓰지 않고, 코뿔소의 버전이 배열 함축을 지원하는 경우

, 당신은이를 사용할 수 있습니다 최소한 선언적.

편집 : 당신은 당신이 localName() 또는 name().localName를 호출하거나 필요 네임 스페이스를 사용하는 경우처럼 엘리야 그레이, 코멘트에 언급했다. 물론, 완전히 정확하려면 네임 스페이스 URI도 비교해야합니다.

또한

은, 분명히,의 SpiderMonkey (파이어 폭스)이 기능은 필터 조건에 function:: 통화를 접두사로 필요하므로 필터는 다음과 같이 보일 것이다 : 일반적으로

/foo-[1-4]/.test(function::name()) // or function::localName() 

, Rhino는 SpiderMonkey를 그렇게 때를, 무엇을 다음과 술어에서 함수 호출을 지원하면 접두어 function::이 필요할 수 있습니다.

+0

네임 스페이스가 관련되어 있으므로'name(). localName'을 사용해야하는 경우 항상 의도 한대로 작동하지 않을 수 있습니다. –

+0

또한, 이것이 작동하는 방식이 아니므로, XML 필터에서 메소드 앞에 'function ::'접두어를 붙여야합니다. 그렇지 않으면 범위를 대신 찾습니다. –

+0

내가 주석을 달았으니, Mirth의 function :: namespace를 사용할 수없는 것 같습니다. 나는 현재 Mirth 포럼을 요구하고있다. 그러나 이것이 내가 찾고있는 해결책이므로 많은 분들께 감사드립니다! –

1

btw, 정규식 없이도 할 수 있습니다.

var foo = xml.row.*.(String(localName()).indexOf("foo-") == 0); 
alert(foo.length() + "\n" + foo.toXMLString()); 
0

A bug이 동작과 관련된 Rhino에 대해 열었습니다. 용감 해지면 버그에 대한 의견에 언급 된대로 Martin Blom이 제안한 patch을 시험해 볼 수 있습니다.