Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java通过缩进遍历所有XML标记_Java_Xml_Parsing_Dom_Iteration - Fatal编程技术网

使用java通过缩进遍历所有XML标记

使用java通过缩进遍历所有XML标记,java,xml,parsing,dom,iteration,Java,Xml,Parsing,Dom,Iteration,因此,我有以下XML文件 样本: 因此,基本上,我希望每个父节点的子节点都有一个缩进(“\t”) 现在,我有以下代码(带递归): publicstaticvoidmain(字符串[]args)抛出SAXException、IOException、, ParserConfiguration异常,TransformerException{ DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance(); Do

因此,我有以下XML文件 样本:

因此,基本上,我希望每个父节点的子节点都有一个缩进(“\t”)

现在,我有以下代码(带递归):

publicstaticvoidmain(字符串[]args)抛出SAXException、IOException、,
ParserConfiguration异常,TransformerException{
DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder();
Document Document=docBuilder.parse(新文件(“C:\\sub.xml”);
解析标签(document.getDocumentElement());
}
公共静态无效解析标签(节点){
System.out.println(node.getNodeName());
NodeList NodeList=node.getChildNodes();
for(int i=0;i
我也知道如何在没有递归的情况下做到这一点,但缩进是我无法做到的。 我知道在某些地方代码会有一些小的变化,但我已经花了相当长的时间在这上面,但没有用

就在那时,我想stackoverflow或许可以帮助我

编辑的代码:现在,为每个子节点添加一个选项卡:但输出有问题

public class NewParseXMLTags {

    public static void main(String[] args) throws SAXException, IOException,
        ParserConfigurationException, TransformerException {

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();

    Document document = docBuilder.parse(new File("C:\\Users\\parasv1\\Desktop\\Self\\sub.xml"));

    StringBuilder tmp = new StringBuilder();

    tmp.append("");
    parseTheTags(tmp, document.getDocumentElement());

}

public static void parseTheTags(StringBuilder indentLevel, Node node) {

    StringBuilder indent = new StringBuilder();

System.out.println(indentLevel+node.getNodeName());


NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
    Node currentNode = nodeList.item(i);

    if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
        if (currentNode.hasChildNodes())
        {
            indent.append("\t");
            parseTheTags(indent, currentNode);      
            }       
        }
     }
   }
}
public类NewParseXMLTags{
公共静态void main(字符串[]args)引发SAXException、IOException、,
ParserConfiguration异常,TransformerException{
DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder();
Document Document=docBuilder.parse(新文件(“C:\\Users\\parasv1\\Desktop\\Self\\sub.xml”);
StringBuilder tmp=新的StringBuilder();
tmp.追加(“”);
解析标签(tmp,document.getDocumentElement());
}
公共静态void解析标签(StringBuilder缩进级别,节点){
StringBuilder缩进=新建StringBuilder();
System.out.println(indentLevel+node.getNodeName());
NodeList NodeList=node.getChildNodes();
for(int i=0;i
找到答案: 因此,在Sbodd的一些良好思考和帮助下,我找到了解决办法:它非常简单

public class ParseXML {

    public static void main(String[] args) throws SAXException, IOException,
        ParserConfigurationException, TransformerException {

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();

    Document document = docBuilder.parse(new File("C:\\Users\\parasv1\\Desktop\\Self\\sub.xml"));

    String tmp = new String();

    tmp = "";
    parseTags(tmp, document.getDocumentElement());

}

    public static void parseTags (String indentLevel, Node node) {
          //print out node-specific items at indentLevel
        System.out.println(indentLevel+node.getNodeName());
          String childIndent = indentLevel + "\t";


          NodeList nodeList = node.getChildNodes();
          for (int i = 0; i < nodeList.getLength(); i++) {
                Node n = nodeList.item(i);
                if (n.getNodeType() == Node.ELEMENT_NODE) {

            parseTags(childIndent, n);
          }
        }


    }           
公共类解析XML{
公共静态void main(字符串[]args)引发SAXException、IOException、,
ParserConfiguration异常,TransformerException{
DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder();
Document Document=docBuilder.parse(新文件(“C:\\Users\\parasv1\\Desktop\\Self\\sub.xml”);
字符串tmp=新字符串();
tmp=“”;
parseTags(tmp,document.getDocumentElement());
}
公共静态void parseTags(字符串缩进级别,节点节点){
//在缩进级别打印特定于节点的项目
System.out.println(indentLevel+node.getNodeName());
字符串childIndent=indentLevel+“\t”;
NodeList NodeList=node.getChildNodes();
for(int i=0;i

对他的任何帮助都将不胜感激!

因此您的最终代码应该如下所示

public static void main(String[] args) throws SAXException, IOException,
        ParserConfigurationException, TransformerException {

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
    Document document = docBuilder.parse(new File("C:\\sub.xml"));
    Transformer t = TransformerFactory.newInstance().newTransformer();
    t.setOutputProperty(OutputKeys.INDENT, "yes");
    t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    ByteArrayOutputStream s = new ByteArrayOutputStream();
    t.transform(new DOMSource(document),new StreamResult(s));
    System.out.println(new String(s.toByteArray()));
}

缩写形式是:添加一个
indentLevel
参数来解析标签。在每次递归调用中,递增indentLevel,并使用它来格式化输出

编辑更新的代码: 实际上,您并没有递归地使用
indentLevel
;传递给子调用的值
indent
,与
indentLevel
变量根本不相关。此外,您可能不想对递归深度变量使用StringBuilder-对它的更改将在递归中上下传播我们称之为继承人

您的基本调用结构大致如下所示

public void parseTags (String indentLevel, Node node) {
  //print out node-specific items at indentLevel
  String childIndent = indentLevel + "\t";

  for (Node n : /*whatever nodes you're recursing to*/) {
    parseTags(childIndent, n);
  }
}

这是一个非常标准的递归构造。在当前节点上执行操作,增加递归深度计数器的值,并根据需要进行递归调用。

很抱歉,这将从何而来?我不完全确定将此部分插入到我的代码中的何处只需将其放在DocumentBuilderFactory.newInstance()行之后;DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder();正如你所建议的,我把它放在那一行后面,但这不会改变输出中的任何内容!谢谢你,我很感激:)但我想你理解错了我的问题。我不想用缩进输出相同的XML。我想做的是,只输出标记名,不带括号,但带缩进。检查我的sample输出。这就是我希望我的输出看起来的样子。现在,我的输出上有全部内容,但唯一缺少的是缩进。有人能帮我吗?我仍然没有任何帮助来解决我的问题!:(我已经尝试过了。我用了一个StringBuilder并尝试附加一个“\t”对于每个递归调用。但是,该方法不起作用!:(可能是,我完全弄错了。如果你能更具描述性,可能会有所帮助。比如,一些示例代码或其他东西。如果你用目前为止的代码更新你的问题,我可能可以看一看——就我所知,到目前为止,你得到的示例根本不会产生任何输出。是的。我已经添加了我需要的代码我必须回答上面的问题。如果我有任何错误,请检查并让我知道
public class ParseXML {

    public static void main(String[] args) throws SAXException, IOException,
        ParserConfigurationException, TransformerException {

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();

    Document document = docBuilder.parse(new File("C:\\Users\\parasv1\\Desktop\\Self\\sub.xml"));

    String tmp = new String();

    tmp = "";
    parseTags(tmp, document.getDocumentElement());

}

    public static void parseTags (String indentLevel, Node node) {
          //print out node-specific items at indentLevel
        System.out.println(indentLevel+node.getNodeName());
          String childIndent = indentLevel + "\t";


          NodeList nodeList = node.getChildNodes();
          for (int i = 0; i < nodeList.getLength(); i++) {
                Node n = nodeList.item(i);
                if (n.getNodeType() == Node.ELEMENT_NODE) {

            parseTags(childIndent, n);
          }
        }


    }           
public static void main(String[] args) throws SAXException, IOException,
        ParserConfigurationException, TransformerException {

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
    Document document = docBuilder.parse(new File("C:\\sub.xml"));
    Transformer t = TransformerFactory.newInstance().newTransformer();
    t.setOutputProperty(OutputKeys.INDENT, "yes");
    t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    ByteArrayOutputStream s = new ByteArrayOutputStream();
    t.transform(new DOMSource(document),new StreamResult(s));
    System.out.println(new String(s.toByteArray()));
}
public void parseTags (String indentLevel, Node node) {
  //print out node-specific items at indentLevel
  String childIndent = indentLevel + "\t";

  for (Node n : /*whatever nodes you're recursing to*/) {
    parseTags(childIndent, n);
  }
}