2013-07-24 22 views
0

我已经从XML文件收集了som数据,现在正在尝试编辑数据,以便它适合我的程序。我收集的数据陈述了给定参数的最小值和最大值,但我只对最小值或最大值感兴趣。删除其他所有字符串条目

XML数据源的样子:

<tolerated> 
    <UMIN2> [ 181.2 186.8 ] </UMIN2> 
    <T_UMIN2> [ 0.4 0.6 ] </T_UMIN2> 
    <UMIN1> [ 197 203 ] </UMIN1> 
    <T_UMIN1> [ 2.4 2.6 ] </T_UMIN1> 
    <UMAX1> [ 249.2 256.8 ] </UMAX1> 
    <T_UMAX1> [ 0.9 1.1 ] </T_UMAX1> 
    <UMAX2> [ 260 268 ] </UMAX2> 
    <T_UMAX2> [ 0.4 0.6 ] </T_UMAX2> 
</tolerated> 

我已经得到了我的程序加载这个数据到一个名为TOL字符串,通过这个代码

public static String tolerance() throws SAXException, IOException, ParserConfigurationException, XPathExpressionException{ 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(O1.replace("\\","\\\\")); 
     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 

     String tTemp = new String(); 

     XPathExpression expr1 = xpath.compile("ptfGen/body/gridCode/"+header2.substring(31,header2.length()-23)+"/tolerated"); 
     Node nodeGettingChanged1 = (Node) expr1.evaluate(doc, XPathConstants.NODE); 

     String toldata = new String(); 

     NodeList childNodes1 = nodeGettingChanged1.getChildNodes(); 
     for (int i = 0; i != childNodes1.getLength(); i++) 
     { 
      Node child = (Node) childNodes1.item(i); 
      if (!(child instanceof Element)) 
       continue; 

      if (child.getNodeName().equals("tolerated"));{ 
       toldata = child.getFirstChild().getNodeValue(); 

       tTemp += toldata.substring(3,toldata.length()-3).replace(" ", "\n") + "\n"; 
      } 
      tol = tTemp; 
     } 
     return tTemp; 
    } 

这给了我所有的值与换行符分隔。

我的问题是现在我可以/如何删除所有其他条目,以便我只有最小值或最大值?'

现在我得到的输出是一样的东西

TOL = {“181.2 \ n186.8 \ N0.4 \ N0.6 \ n197 \ n .......... “};

和我AMM寻找的是

TOL = { “181.2 \ N0.4 \ n197 \ n ..........”};

+0

我不想更改XML文件,只是字符串。 – abbisDK

+0

查看http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)或http://docs.oracle.com /javase/7/docs/api/java/util/StringTokenizer.html – neutrino

回答

1

如果最小值总是第一,最大值总是第二。

所有你需要做的是改变

tTemp += toldata.substring(3,toldata.length()-3).replace(" ", "\n") + "\n"; 

tTemp += toldata.substring(3,toldata.length()-3).split(" ")[c] + "\n"; 

其中c为0,第一个(最小)和1个第二(最大)。

或更简单的

tTemp += toldata.split(" ")[c] + "\n"; 

c其中在各情况2或3。

这当然假设字符串总是以确切的形式:" [ number number ] "(总是在完全相同的位置上具有完全相同的空间量)。的"\\s+"代替" "一个简单的regular expression将允许一个或多个空格代替,即:

tTemp += toldata.split("\\s+")[c] + "\n"; 

\s意味着空白和+指一个或多个。额外的\是为了逃避编译器的\

0

我会做到以下几点:

  1. 定义一个类来保存临时工:

    public static class TempEntry { 
        private final String min, max; 
    
        public TempEntry(min, max){ 
         this.min = min; 
         this.max = max; 
        } 
    
        public String getMin(){ 
         return min; 
        } 
    
        public String getMax(){ 
         return max; 
        } 
    } 
    
  2. 在解析时,分裂中的节点文本并创建一个新的TempEntry

  3. 解析器可以返回一个不可变的List<TempEntry>TempEntry[]数组。

  4. 现在创建一个方法或遍历列表和漂亮的版画它基于参数(仅分钟,只有最大,这两个等)

这样,您就不是一个新的类将您的解析逻辑与您的演示逻辑耦合(可能会更频繁地更改)。

+0

我并不是说它做得很好(它肯定可以更模块化),但在我看来,这对于这样的简单的问题。 – Dukeling

相关问题