首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中类似于XML的文本文件解析

java中类似于XML的文本文件解析
EN

Stack Overflow用户
提问于 2014-03-28 03:16:23
回答 2查看 551关注 0票数 0

需要读取一个文本文件,它看起来像一个由多个XML文件组成的XML.The文本文件,带有一个父标签.Need来解析文件,并逐行解析文件,需要将所需的子标签的相应元素写到另一个文本文件.Need中,甚至在父标签内重复多次,在一行中将元素写到父标签之后的下一行。我知道如何读取文件和写入文件,但我无法按照要求获得读取它的逻辑.Please帮助我走出.Any帮助非常感谢。

代码语言:javascript
复制
 1234566546     AbcdeXYZ-23243423     1030253498     23423423423     
代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

发布于 2014-03-28 04:28:29

手工解析xml是一种痛苦的时间浪费。如果只创建一个带有包装标签的临时文件并使用xml解析器,会容易得多,如下所示:

代码语言:javascript
复制
    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());
票数 1
EN

Stack Overflow用户

发布于 2014-03-28 03:27:06

您必须使用先进先出的队列结构

你的基本算法是这样的

  1. 当您遇到标记时,请使用其下面的值
  2. 将标记存储在先进先出中。
  3. 一旦您遇到结束标记,请匹配存储在先进先出中的标记(如果有效),否则pop将引发异常。
  4. 在分析结束时Q必须为空。

当然,您还可以使用其他库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22697118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档