2010-07-05 6 views
4

XPath 표현식을 사용하여 JDOM 문서에서 일부 요소를 추출하는 데 매우 어려움을 겪고 있습니다. 다음은 샘플 XML 문서입니다. ItemCost 요소를 모두 문서에서 제거하고 싶습니다만, 지금은 평가할 XPath 표현식을 얻는 데 문제가 있습니다.JDOM, XPath 및 네임 스페이스 상호 작용

<srv:getPricebookByCompanyResponse xmlns:srv="http://ess.com/ws/srv"> 
    <srv:Pricebook> 
     <srv:PricebookName>Demo Operator Pricebook</srv:PricebookName> 
     <srv:PricebookItems> 
      <srv:PricebookItem> 
       <srv:ItemName>Demo Wifi</srv:ItemName> 
       <srv:ProductCode>DemoWifi</srv:ProductCode> 
       <srv:ItemPrice>15</srv:ItemPrice> 
       <srv:ItemCost>10</srv:ItemCost> 
      </srv:PricebookItem> 
      <srv:PricebookItem> 
       <srv:ItemName>1Mb DIA</srv:ItemName> 
       <srv:ProductCode>Demo1MbDIA</srv:ProductCode> 
       <srv:ItemPrice>20</srv:ItemPrice> 
       <srv:ItemCost>15</srv:ItemCost> 
      </srv:PricebookItem> 
     </srv:PricebookItems> 
    </srv:Pricebook> 
    </srv:getPricebookByCompanyResponse> 

나는 일반적으로 단지 등 // SRV 같은 표현을 사용합니다 : ItemCost 다른 문서에 잘 작동 이러한 요소를 식별하는, 그러나 여기 지속적으로 목록에 0 노드를 반환합니다. 여기에 내가 사용하고 코드입니다 :

응답 (AN XMLOutputter를 확인) 위의 XML 조각을 포함하는 JDOM 요소입니다
Namespace ns = Namespace.getNamespace("srv","http://ess.com/ws/srv"); 
XPath filterXpression = XPath.newInstance("//ItemCost"); 
filterXpression.addNamespace(ns); 
List nodes = filterXpression.selectNodes(response); 

. 노드는이 문서를 파싱 할 때마다 size() == 0을 계속 갖습니다. 같은 문서에서 Eclipse의 XPath 파서를 사용하면이 표현식이 작동하지 않습니다. 파고 들자마자, 다음 식으로 작업 할 Eclipse 평가자를 얻었습니다. // * [local-name() = 'ItemCost'], Java 코드의 // srv : ItemCost를이 값으로 대체해도 결과가 생성되지 않았습니다. XML에서 네임 스페이스 선언을 제거하면 // srv : ItemCost가 Eclipse 파서에서 올바르게 해결되지만 XML에서 XML을 제거 할 수 없다는 것을 알아 차렸다. 나는 지금이 순간에 우리 머리를 긁어 왔고, 올바른 방향으로 조금 움직여 주셔서 감사합니다.

많은 감사

편집 : 고정 코드 -

Document build = new Document(response); 
XPath filterXpression = XPath.newInstance("//srv:ItemCost"); 
List nodes = filterXpression.selectNodes(build); 
+0

죄송합니다. @ 브린, C#에서이 작업을 수행하는 방법을 알고 있지만 JDOM에 대한 경험이 없습니다. (따라서 답변을 삭제했습니다. –

답변

1

이상한, 참 ... 내가 JDOM 내 측면에서 테스트하고 미리보기는 빈리스트, 의도 한대로 다음 작품을 제작 :

//srv:ItemCost 
2 
,691 :

public static void main(String[] args) throws JDOMException, IOException { 
    File xmlFile = new File("sample.xml"); 
    SAXBuilder builder = new SAXBuilder(); 
    Document build = builder.build(xmlFile);   
    XPath filterXpression = XPath.newInstance("//srv:ItemCost"); 
    System.out.println(filterXpression.getXPath()); 
    List nodes = filterXpression.selectNodes(build);   
    System.out.println(nodes.size()); 
} 

IT는 출력을 생성

+2

감사합니다 Andreas - 당신은 나를 올바른 길로 인도했습니다. 불행히도 입력은 이미 구성된 JDOM 요소로오고 있으므로 SAXBuilder에서 처리하기 위해 serialize하는 것은 거의 OTT가 아닙니다. 그러나 주위를 둘러 보는 것만으로 Document에 Element를 래핑하는 것이 모두 필요한 것처럼 보입니다. 이제는 모두 정상적으로 작동합니다. 누군가가 알아낼 수없는 이유를 알고 싶습니까? –

+0

@BrynSadler'Document'에 JDOM'Element'를 래핑하는 것으로 충분했고, 저의 하루가 저장되었습니다! 고마워요! :) –