【问题标题】:stringbuilder in for loop with if statement带有if语句的for循环中的stringbuilder
【发布时间】:2017-09-29 18:42:11
【问题描述】:

我的 java 程序有问题,它读取我的 xml 文件并向我显示我想要的内容....我有 3 行,它向我显示 System.out.println 以及这 3 行与我想要的具体内容。

但我必须将这些行作为字符串返回。这是我的另一个类中的问题,我使用返回字符串我只得到我的 xml 文件的第一行。所以我认为我的返回值和 for 循环有问题。 这是我与 java 程序一起使用的代码,它与 system.out.println.... 一起使用。

package org.java_websocket.xmlreader;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class websocketxmlrader {
     public static void main(String argv[]){

            try {

            File fXmlFile = new File("...test123.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);


            doc.getDocumentElement().normalize();


            NodeList nList = doc.getElementsByTagName("item");

            for (int temp = 0; temp < nList.getLength(); temp++) {

                Node nNode = nList.item(temp);


                if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                    Element eElement = (Element) nNode;

                    String s1 = "{\"art.\":1234,";
                    String s2 = "\"value\":5678,";
                    String s3 = "\"set\":null,";
                    String s4 = "\"condition\":" + eElement.getElementsByTagName("length").item(0).getTextContent();
                    String s5=  "\"height\"" + eElement.getElementsByTagName("weight").item(0).getTextContent();
                    String s6= "\"average\":5678,";
                    String s7= "\"content\":12,";
                    String s8= "\"div.\":78}";
                    String s = s1+s2+s3+s4+","+s5+","+s6+s7+s8;
                    System.out.println(s);

                }
            }
            } catch (Exception e) {
            e.printStackTrace();
            }
          }


}

这是我从字符串创建返回值的文件

我在这里从 public static void main(String argv[]){ ..... 改为 .. public String wert(){....

Here is the full code

        package packageWebSocket;

    import java.io.File;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;

    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;

    public class websocketxmlrader {
          public  String wert(){
     try {

                File fXmlFile = new File("...test123.xml");
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(fXmlFile);


                doc.getDocumentElement().normalize();


                NodeList nList = doc.getElementsByTagName("item");

                for (int temp = 0; temp < nList.getLength(); temp++) {

                    Node nNode = nList.item(temp);


                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                        Element eElement = (Element) nNode;

                        String s1 = "{\"art.\":1234,";
                        String s2 = "\"value\":5678,";
                        String s3 = "\"set\":null,";
                        String s4 = "\"condition\":" + eElement.getElementsByTagName("length").item(0).getTextContent();
                        String s5=  "\"height\"" + eElement.getElementsByTagName("weight").item(0).getTextContent();
                        String s6= "\"average\":5678,";
                        String s7= "\"content\":12,";
                        String s8= "\"div.\":78}";
                        String s = s1+s2+s3+s4+","+s5+","+s6+s7+s8;

                        return s;
    }



}
             }catch (Exception e) {
                    e.printStackTrace();

                }
            return null;
    }
}

如何在这里使用 Stringbuilder 我认为这将解决问题。 因为返回字符串还应该遍历 xml 文件中的每一行,而不仅仅是从第一行返回一个字符串。

谢谢!

【问题讨论】:

  • 你能只给我们看必需的代码而不是完整的代码吗?
  • 也许你想fix your indentation 让人们更容易帮助你。
  • 试试那个“研究”的东西。有大量链接展示了如何使用真正的 StringBuilder(例如 here

标签: java string stringbuilder xmlreader


【解决方案1】:

如果您到达return,您将离开该方法。因此,如果您找到一个类型为 Node.ELEMENT_NODE 的节点,则构建您的 String s,返回此值并离开该方法。

您可以添加换行符而不是返回值,或者(如果允许更改返回类型)使用List&lt;String&gt; 并为每一行添加s 到列表中。

StringBuild sb = new StringBuilder(); // with linebreaks
List<String> lines = new ArrayList<>(); // each line one entry
for (int temp = 0; temp < nList.getLength(); temp++) {
    Node nNode = nList.item(temp);
    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
        String s = ...;
        if (sb.length() > 0) // add linebreak
            sb.append(System.getProperty("line.separator"));
        sb.append(s);
        lines.add(s);
    }
}

【讨论】:

  • 并且错误是...? (对不起,我的水晶球坏了)
  • 这一行有多个标记 - ArrayList 无法解析为类型 - List 无法解析为类型 - 类型 List 不是通用的;它不能用参数参数化
  • 需要导入java.util.List和java.util.ArrayList。
  • 是的,这是可行的,但是当我运行我加载返回值的其他 java 程序时,我得到 null ...因为我在程序中最后插入了您的代码...返回空值;你可以在我上面的第二个代码中看到它。
  • 当然你需要改变这一行。如果你想要一个字符串,它是return sb.toString()。如果您可以更改返回值,您只需return lines
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多