在Java中将多个节点从文本格式转换为XML格式时遇到问题

时间:2016-07-06 03:25:42

标签: java xml

我有一个将文本文件转换为XML的Java程序。我需要以下格式:

    <app:defaults>
    <app:schedules>
    <app:run>
    <app:schedule>schedule frequency value</app:schedule>
    </app:run>
    </app:schedules>
    <app:rununit>
    <app:agent>agent hostname value</app:agent>
    </app:rununit> 
    </app:defaults>

结尾的“/ app:schedules”标记未附加在正确的位置         在“/ app:run”标签之后。该程序正在生成以下(这是不正确的):

   <app:defaults>
   <app:schedules>
   <app:run>
   <app:schedule>schedule frequency value</app:schedule>
   </app:run>
   <app:rununit>
   <app:agent>agent hostname value</app:agent>
  </app:rununit> 
  </app:schedules>
 </app:defaults>

java程序中的方法如下:对于此示例,我将文本扩展到每个节点以显示数据应该是什么。 - 此方法从输入文本文件中获取String args。

 public static void main(String[] args) {
  String infile = args[0];
  String outxml = args[1];

 BufferedReader in;
 StreamResult out;

 DocumentBuilderFactory icFactory = DocumentBuilderFactory.newInstance();
  DocumentBuilder icBuilder;
  try {
    in = new BufferedReader(new FileReader(infile));
    out = new StreamResult(outxml);

    icBuilder = icFactory.newDocumentBuilder();
    Document doc = icBuilder.newDocument();
    Element mainRootElement = doc.createElementNS ("http://dto.cybermation.com/application", "app:appl");
    mainRootElement.setAttribute("name", "TESTSHEDULE");
    doc.appendChild(mainRootElement);

                 ...

       private static Node processTagElements3(Document doc, String "app:defaults") {

        Element node1 = doc.createElement("app:schedules");
        Element node2 = doc.createElement("app:run");
        Element node3 = doc.createElement("app:schedule");
        Element node4 = doc.createElement("app:rununit");
        Element node5 = doc.createElement("app:agent");

        node1.appendChild(node2);
        node2.appendChild(node3);
        node3.appendChild(doc.createTextNode("schedule frequency value"));
        node1.appendChild(node4);
        node4.appendChild(node5);
        node5.appendChild(doc.createTextNode("agent hostname value"));

    return node1;
}

我已经在这些节点之间使用不同的appenchild参数对其进行了测试,但是在一个砖墙上运行并形成了这个输出。关于组织节点标签插入的最佳方法的任何建议和建议都非常感谢。可能有一些我很想念的事情。

3 个答案:

答案 0 :(得分:0)

注意:我不是Java中XML解析的专家。

试着拼一下我在机器上的一些示例代码,看看是否能解决你的问题。所以就是这样。

示例代码:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringReader;
import java.io.StringWriter;\

public class test {

    public static void main(String[] args) throws Exception {

        String xml = "<app:defaults>\n" +
                "    <app:schedules>\n" +
                "    <app:run>\n" +
                "    <app:schedule>schedule frequency value</app:schedule>\n" +
                "    </app:run>\n" +
                "    </app:schedules>\n" +
                "    <app:rununit>\n" +
                "    <app:agent>agent hostname value</app:agent>\n" +
                "    </app:rununit> \n" +
                "    </app:defaults>";
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
                .parse(new InputSource(new StringReader(xml)));

        NodeList errNodes = doc.getElementsByTagName("error");
        if (errNodes.getLength() > 0) {
            Element err = (Element)errNodes.item(0);
            System.out.println(err.getElementsByTagName("errorMessage")
                    .item(0).getTextContent());
        } else {
            // success
            DOMSource domSource = new DOMSource(doc);
            StringWriter writer = new StringWriter();
            StreamResult result = new StreamResult(writer);
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.transform(domSource, result);

            System.out.println(writer.toString());
        }
}

<强>输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <app:defaults>
    <app:schedules>
      <app:run>
        <app:schedule>schedule frequency value</app:schedule>
      </app:run>
    </app:schedules>
    <app:rununit>
      <app:agent>agent hostname value</app:agent>
    </app:rununit> 
  </app:defaults>

此代码似乎与您期望的一样有效。试一试,让我知道解决方案是否合适。

我认为这里的想法是使用预先编写的Java API而不是编写我们自己的解析器。因为这些API通常更可靠,因为许多其他API每天都会使用它。

答案 1 :(得分:0)

如果你用有意义的名字命名你的节点(让我们说setInterval()等),情况会更容易,你不觉得吗?

话虽这么说,这可能就是你想要的:

runNode

请注意使用的 Element defaultNode = doc.createElement("app:default"); Element schedulesNode = doc.createElement("app:schedules"); Element runNode = doc.createElement("app:run"); Element scheduleNode = doc.createElement("app:schedule"); Element rununitNode = doc.createElement("app:rununit"); Element agentNode = doc.createElement("app:agent"); defaultNode.appendChild(schedulesNode); schedulesNode.appendChild(runNode); runNode.appendChild(scheduleNode); scheduleNode.appendChild(doc.createTextNode("schedule frequency value")); defaultNode.appendChild(rununitNode); rununitNode.appendChild(agentNode); agentNode.appendChild(doc.createTextNode("agent hostname value"));

答案 2 :(得分:0)

谢谢大家! 我决定修改脚本以接受文件输入作为我的arg - 现在工作正常并且是一个更简单的解决方案:

public class test2 {

public static void main(String[] args) throws Exception {
      File file = new File(args[0]);

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try{
 DocumentBuilder builder = factory.newDocumentBuilder();

  FileInputStream fis = new FileInputStream(file);
     InputSource is = new InputSource(fis);
     Document doc = builder.parse(is);

    NodeList errNodes = doc.getElementsByTagName("error");
    if (errNodes.getLength() > 0) {
        Element err = (Element)errNodes.item(0);
        System.out.println(err.getElementsByTagName("errorMessage").item(0).getTextContent());
    } else {
  // success
        DOMSource domSource = new DOMSource(doc);
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.transform(domSource, result);

        System.out.println(writer.toString());
          }
        } catch (Exception e) {
        e.printStackTrace();
        }
      }
    }
相关问题