2012-03-13 4 views
1

Проблема: при анализе XML с пространствами имен через XPath он частично анализирует XML, например, если я установлен в XPath:/SOAP-ENV: Envelope/SOAP-ENV: Body - Парсер распознает это хорошо, но если я пойду дальше - парсер подавит, не возвращая исключения.Разбор XML с пространствами имен через dom4j XPath странное поведение

Это XML:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:m0="http://schemas.compassplus.com/two/1.0/fimi.xsd" 
xmlns:m="http://schemas.compassplus.com/two/1.0/fimi.wsdl"> 
<SOAP-ENV:Body> 
<m:GetAcctInfoRp xmlns:m="http://schemas.compassplus.com/two/1.0/fimi.xsd"> 
<Response Response="1" Product="FIMI" Ver="0"><m0:Avail>995526.4</m0:Avail> 
<m0:Bonus>0</m0:Bonus> 
<m0:Branch>1</m0:Branch> 
<m0:Cards><m0:Row> 
<m0:PAN>6706250002450356</m0:PAN> 
<m0:MBR>0</m0:MBR> 
<m0:CardUID>E4BFBC24A2844F13BE5C5AEEB15D27CE</m0:CardUID> 
<m0:Status>1</m0:Status> 
</m0:Row> 
<m0:Row> 
<m0:PAN>6706255660781224</m0:PAN> 
<m0:MBR>0</m0:MBR> 
<m0:CardUID>971111C18D774C3BA26434336CB57475</m0:CardUID> 
<m0:Status>1</m0:Status> 
</m0:Row> 
</m0:Cards> 
<m0:CreditHold>0</m0:CreditHold> 
<m0:Currency>810</m0:Currency> 
<m0:DebitHold>50240.81</m0:DebitHold> 
<m0:DropTmpOverOnRefresh>0</m0:DropTmpOverOnRefresh> 
<m0:FoundAccount>40817810200001058114</m0:FoundAccount> 
<m0:FoundAccountUID>E79459BEEEF94BEFBA57D0D23503EF7E</m0:FoundAccountUID> 
<m0:LastDepAmount>10</m0:LastDepAmount> 
<m0:LastDepTime>2012-03-06T17:23:35</m0:LastDepTime> 
<m0:LastRefreshTime>2012-02-22T12:49:47</m0:LastRefreshTime> 
<m0:LastTranId>4172</m0:LastTranId> 
<m0:LastWdlAmount>100</m0:LastWdlAmount> 
<m0:LastWdlTime>2012-03-06T17:29:44</m0:LastWdlTime> 
<m0:Ledger>1045767.21</m0:Ledger> 
<m0:MaskBalances>0</m0:MaskBalances> 
<m0:Overdraft>9000000</m0:Overdraft> 
<m0:PersonExtId>1891</m0:PersonExtId> 
<m0:PersonFIO>bla bla bla</m0:PersonFIO> 
<m0:PersonId>782</m0:PersonId> 
<m0:Remain>1046068.21</m0:Remain> 
<m0:Status>3</m0:Status> 
<m0:TmpOverdraft>0</m0:TmpOverdraft> 
<m0:Type>1</m0:Type> 
<m0:UserFields><m0:Row> 
<m0:Name>test</m0:Name> 
<m0:TextValue>тест</m0:TextValue> 
</m0:Row> 
</m0:UserFields> 
</Response> 
</m:GetAcctInfoRp> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Java-код, который должен разобрать этот XML-файл:

String res = RequestMethods.executeXMLPostRequest(url, xml); 
Document doc = DocumentHelper.parseText(res.trim()); 

     String session = doc.valueOf("SOAP-ENV:Envelope/SOAP-ENV:Body/m:GetAcctInfoRp/Response/m0:Avail"); 

PS извините за мой английский, может быть кто-то решить эту проблему еще? Пожалуйста, помогите.

1-я проблема решена, еще один вопрос: как я могу попасть в циклическую структуру, например, если у нас есть несколько SOAP-ENV: Envelope/SOAP-ENV: Body // m0: Avail elements?

+0

Какие библиотеки вы используете? (Не могли бы вы рассказать о классах Document и DocumentHelper, которые вы используете? Что такое полное имя класса с именем пакета?) – bpgergo

+0

Как видно в этом заголовке, библиотека является dom4j, package - import org.dom4j. *; –

+0

спасибо, я не заметил lib в заголовке – bpgergo

ответ

1

Это работает для меня

public static void main(String[] args) throws DocumentException { 
    String xmlText = getContents(new File("/home/bpgergo/Temp/9682103.xml")); 
    Document doc = DocumentHelper.parseText(xmlText); 
    String session = doc.valueOf("SOAP-ENV:Envelope/SOAP-ENV:Body//m0:Avail"); 
    System.out.println("session:"+session); 
} 
+0

, это также работает 'String session = doc.valueOf (« SOAP-ENV: Envelope/SOAP-ENV: Body // Response/m0: Avail »);' Если я включаю 'm: GetAcctInfoRp' в пути, то это не сработает. – bpgergo

+0

Duuuuuuude U've спас меня aaaaaasssss =) Большое спасибо, я дал U точку и принимаю Ваш ответ, спасибо человеку. –

+0

И еще один вопрос: как я могу попасть в циклическую структуру, например, если у нас есть несколько SOAP-ENV: Envelope/SOAP-ENV: Body // m0: Avail elements? Pleeeeeeeese =) –

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