2014-03-27 25 views
0

需要读取一个看起来像XML的文本文件。该文本文件由多个XML文件组成,并带有父标签。需要解析文件并逐行解析并需要将所需的子标签的相应元素甚至在父标签内重复多次地写入到另一个文本文件中。需要在父标签之后将元素写入下一行。我知道如何读取文件并且写文件,但我无法得到逻辑阅读它的要求。请帮助我。任何帮助,非常感谢。在java中解析类似于XML的文本文件

AbcdeXYZ-23243423

<parentnode xmlns="http://www.fpml.org/FpML-5/recordkeeping" fpmlVersion="5-5" xmlns:abcde="http://www.abcde.com/ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.abcde.com/ext /../xmls/XYZ/recordkeeping/abcde-ext.xsd"> 
<Child1 Child1Scheme="http://www.google.com">1234566546</Child1> 
<Child1 Child1Scheme="http://www.fpml.org/coding-scheme/external/UNique">AbcdeXYZ-154555</Child1> 
<country countryScheme="http://www.fpml.org/coding-scheme/external/country-identifier">1030253498</country> 
<state stateScheme="http://www.fpml.org/coding-scheme/external/state-identifier">434343242</state> 
</parentnode> 

<parentnode xmlns="http://www.fpml.org/FpML-5/recordkeeping" fpmlVersion="5-5" xmlns:abcde="http://www.abcde.com/ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.abcde.com/ext /../xmls/XYZ/recordkeeping/abcde-ext.xsd"> 
<Child1 Child1Scheme="http://www.google.com">1234566546</Child1> 
<Child1 Child1Scheme="http://www.fpml.org/coding-scheme/external/UNique">AbcdeXYZ-4566545</Child1> 
<country countryScheme="http://www.fpml.org/coding-scheme/external/country-identifier">1030253498</country> 
<state stateScheme="http://www.fpml.org/coding-scheme/external/state-identifier">2323232323</state> 
</parentnode> 
+1

你能不能把它包装都在一个根节点,然后使用XML解析器?否则,我会找到一种方法来分解多个XML文件并分别解析它们。 – Danny

+0

@丹尼它应该被解析为一个文本文件。 – Euphoria

+0

XML是一个文本文件。 – m0skit0

回答

0

你将不得不使用一个队列结构[先进先出]

您的基本算法中会像

  1. 当您遇到标签时,请使用以下值:
  2. 将标签存储在FIFO中。
  3. 一旦遇到结束标记,匹配存储在FIFO 中的标记,如果有效,则弹出否则抛出异常。
  4. 解析结束时,您的Q必须为空。

当然,还有其他的图书馆,你可以使用。

1

手动解析xml是时间的痛苦浪费。如果会更容易只创建一个包装标签的临时文件和使用XML解析器,像这样:

Path inputFile = Paths.get("input.xml"); 
    Path tempFile = Paths.get("temp.xml"); 
    Path outputFile = Paths.get("output.xml"); 

    // make a temp file with fixed xml formatting 
    Files.write(tempFile, "<root>".getBytes()); 
    for (String line : Files.readAllLines(inputFile, StandardCharsets.UTF_8)) { 
     Files.write(tempFile, line.getBytes(), StandardOpenOption.APPEND); 
    } 
    Files.write(tempFile, "</root>".getBytes(), StandardOpenOption.APPEND); 


    // parse xml and build output string 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(tempFile.toFile()); 
    StringBuilder sb = new StringBuilder(); 

    NodeList parents = doc.getElementsByTagName("parentnode"); 
    for (int i = 0; i < parents.getLength(); i++) { 
     NodeList children = parents.item(i).getChildNodes(); 
     for (int j=0; j<children.getLength(); j++) { 
      sb.append(children.item(j).getTextContent() + " "); 
     } 
    } 


    // clean up temp file 
    Files.delete(tempFile); 


    // write output file 
    Files.write(outputFile, sb.toString().getBytes()); 
+0

我真的很感谢您的帮助。但我试图解析文本文件,这是一个转储多个XML文件一个接一个,请让我知道解析文本文件的逻辑,要求 – Euphoria

+0

看看我编写的代码并思考它在做什么以及为什么。 – azurefrog

+0

检测每个XML文档的唯一简单方法是添加一个根节点,然后让XML解析器完成辛勤工作,如azurefrog的解决方案。如果整个文件太大而无法放入内存中,则可以使用SAX或StAX解析器而不是DOM。唯一的选择是手动解析XML。但那意味着更多的工作。应该有一个很好的理由来证明这一点。 – vanje