在这种情况下如何做一个字符串的子串

时间:2014-04-03 14:46:17

标签: java

我从第三方服务器获得以下xml响应

<t0>

<t9>0</t9>

<t1>
<t15>DFT</t15>
<t3>232.15</t3>
<t6>70</t6>
<t4>-3.60</t4>
<t5>-1.53</t5>
<t7>236.10</t7>
<t8>237.10</t8>
<t10>227.50</t10>
<t11>235.75</t11>


<t2>Chimera</t2>

<t58>0.00</t58>
<t59>0.00</t59>



<t12>231.72</t12>
<t19>0</t19>
<t20>4743</t20>
<t13>4809774</t13>
<t17>11145.21</t17>
<t14>04/03/2014 15:59:16</t14>



<t25>0</t25>
<t26>0</t26>
<t27>0</t27>
<t28>0</t28>
<t29>0</t29>

<t30>0</t30>
<t31>0</t31>
<t32>0</t32>
<t33>0</t33>
<t34>0</t34>

<t35>0.00</t35>
<t36>0.00</t36>
<t37>0.00</t37>
<t38>0.00</t38>
<t39>0.00</t39>

<t40>35</t40>
<t41>0</t41>
<t42>0</t42>
<t43>0</t43>
<t44>0</t44>

<t45>4743</t45>
<t46>0</t46>
<t47>0</t47>
<t48>0</t48>
<t49>0</t49>

<t50>232.15</t50>
<t51>0.00</t51>
<t52>0.00</t52>
<t53>0.00</t53>
<t54>0.00</t54>

</t1>



<t1>
<t2>Chimera</t2>
<t15>DSF</t15>
<t3>232.25</t3>
<t6>25</t6>
<t4>-3.45</t4>
<t5>-1.46</t5>
<t7>236.90</t7>
<t8>237.50</t8>
<t10>228.00</t10>
<t11>235.70</t11>
<t12>231.72</t12>
<t19>0</t19>
<t20>0</t20>
<t13>699076</t13>
<t17>1619.90</t17>
<t14>03/04/2014 16:55:19</t14>

<t58>0.00</t58>
<t59>0.00</t59>


<t25>0</t25>
<t26>0</t26>
<t27>0</t27>
<t28>0</t28>
<t29>0</t29>

<t30>0</t30>
<t31>0</t31>
<t32>0</t32>
<t33>0</t33>
<t34>0</t34>

<t35>0.00</t35>
<t36>0.00</t36>
<t37>0.00</t37>
<t38>0.00</t38>
<t39>0.00</t39>

<t40>0</t40>
<t41>0</t41>
<t42>0</t42>
<t43>0</t43>
<t44>0</t44>

<t45>0</t45>
<t46>0</t46>
<t47>0</t47>
<t48>0</t48>
<t49>0</t49>

<t50>0.00</t50>
<t51>0.00</t51>
<t52>0.00</t52>
<t53>0.00</t53>
<t54>0.00</t54>

</t1>



</t0>

我只需要获取第一个t1数据并消除剩余的输出应该

<t1>
<t15>DFT</t15>
<t3>232.15</t3>
<t6>70</t6>
<t4>-3.60</t4>
<t5>-1.53</t5>
<t7>236.10</t7>
<t8>237.10</t8>
<t10>227.50</t10>
<t11>235.75</t11>


<t2>Chimera</t2>

<t58>0.00</t58>
<t59>0.00</t59>



<t12>231.72</t12>
<t19>0</t19>
<t20>4743</t20>
<t13>4809774</t13>
<t17>11145.21</t17>
<t14>04/03/2014 15:59:16</t14>



<t25>0</t25>
<t26>0</t26>
<t27>0</t27>
<t28>0</t28>
<t29>0</t29>

<t30>0</t30>
<t31>0</t31>
<t32>0</t32>
<t33>0</t33>
<t34>0</t34>

<t35>0.00</t35>
<t36>0.00</t36>
<t37>0.00</t37>
<t38>0.00</t38>
<t39>0.00</t39>

<t40>35</t40>
<t41>0</t41>
<t42>0</t42>
<t43>0</t43>
<t44>0</t44>

<t45>4743</t45>
<t46>0</t46>
<t47>0</t47>
<t48>0</t48>
<t49>0</t49>

<t50>232.15</t50>
<t51>0.00</t51>
<t52>0.00</t52>
<t53>0.00</t53>
<t54>0.00</t54>

</t1>

我试过这种方式,但是如果它是一个不同的符号

,这将失败
 int a = abc.indexOf("<t1>");
          int b = abc.indexOf("</t1>");

          System.out.println(a);
          System.out.println(b);
          String newstr = abc.substring(24, 848);

我的计划是,一旦我对此进行了子串,我将使用STAX API将此数据设置为java对象

如果有更好的方法可以告诉我吗?

4 个答案:

答案 0 :(得分:3)

使用Jsoup

String firstT1 = Jsoup.parse(xml).getElementsByTag("t1").first().outerHtml();

答案 1 :(得分:0)

在解析xml标记时,我通常使用split而不是substring。

这样的事情应该有效:

abc.split("<t1>")[1].split("</t1>")[0];

答案 2 :(得分:0)

  

我的计划是,一旦我对此进行了子串,我将使用STAX API将此数据设置为java对象

错误的计划。当你计划在之后立即将结果传递给真正的解析器时,为什么你会使用容易出错的手动解析呢?

将整个String传递给StAX并仅提取所需的元素。 StAX是一个流API,因此您不会通过预处理字符串来实际节省内存。

答案 3 :(得分:0)

为什么不尝试使用Xpath。它专门为此任务而设计。 Xpath表达式应该类似于“// t1 [first()]”。

对于以下情况,它会更加健壮:

  • <t1 >
  • <t1 attribute="foo">
  • <![CDATA[some user just tiped <t1> in the code ]]>

请参阅:How to read XML using XPath in Java