【问题标题】:text file to xml conversion java文本文件到xml转换java
【发布时间】:2011-06-17 08:15:45
【问题描述】:

我有一个文本文件,我想将其转换为 java 中的 XML 文件: 用java读取文件,然后转换成xml。

Contact
Arun_niit
Arun_niit
nura_e@yahoo.co.in
Contact
Contact
Bống MũnHải
Hải Anh Bống Mũn
http://www.facebook.com/profile.php?id=689849077
Contact

我希望按以下顺序输出:

<contact>
<Firstname>Arun_niit</Firstname>
<Secondname>Arun_niit</Secondname>
<Email>nura_e@yahoo.co.in</Email>
</contact>
<contact>
<Firstname>Bống MũnHải</Firstname>
<Secondname>Hải Anh Bống Mũn</Secondname>
<URL>http://www.facebook.com/profile.php?id=689849077</URL>
</contact>

请帮助我,我们将非常感谢您提供示例代码。

请问这是正确的做法吗... [代码]

  import java.io.*;
  import java.io.ObjectInputStream.GetField;
  import org.w3c.dom.*;
  import javax.xml.parsers.*;
  import javax.xml.transform.*;
  import javax.xml.transform.stream.*;
  import javax.xml.transform.dom.*;
  import java.util.Scanner;

public class Item  {

private String Name;
private String LName;
private String Email;
public static void main (String args[]) {

public static void readFile(File file)  
{
Scanner freader = new Scanner("D:/juin17.part");
String line = null;
while (freader.hasNextLine()) {
    line = freader.nextLine();
   if(line==contact){
Item item = new item();
    item.Name =freader.nextLine();
    item.LName =freader.nextLine();
    item.Email =freader.nextLine();
    freader.nextLine();
    }
    itemList.add(item);
}
freader.close();  
  }

 FileOutputStream fos = new FileOutputStream(info.file);
 OutputFormat of = new OutputFormat("XML","windows-1250",true);
 of.setIndent(1);
 of.setIndenting(true);
 ContentHandler hd = serializer.asContentHandler();
 hd.startDocument();
 AttributesImpl atts = new AttributesImpl();
 hd.startElement("","",info.category,atts);
 for (int i=0;i<itemList.size();i++)
{
   atts.clear();
    Item temp = new Item();
    temp = itemList.get(i);
    hd.startElement("","","FirstName",atts);
    hd.characters(temp.Name.toCharArray(),0,temp.Name.length());
    hd.endElement("","","FirstName");
    hd.startElement("","","LastName",atts);
    hd.characters(temp.LName.toCharArray(),0,temp.LName.length());
    hd.endElement("","","LastName");
    hd.startElement("","","Email",atts);
    hd.characters(temp.mail.toCharArray(),0,temp.mail.length());
    hd.endElement("","","EMail");
 }
 hd.endElement("","",info.category);
 hd.endDocument();
 fos.close();
 }
 }

【问题讨论】:

  • 我格式化了你不可读的问题,希望没有语义丢失。
  • 您确定FirstnameSecondname 对于第二个联系人都应该是“Bống MũnHải”吗?如果是这样,算法是什么 - 您是否只是忽略第二行(“Hải Anh Bống Mũn”)并将第一行用于两个字段?
  • 更改了信息。
  • 我想知道,您为什么更改已接受的答案

标签: java xml text


【解决方案1】:

here 是使用 DOM 创建 xml 的示例 我认为您可以根据自己的目的对其进行更改。

如果你想要的只是从文本创建一个 xml,我认为它会比使用 SAX 更简单

希望这会有所帮助。

【讨论】:

    【解决方案2】:
      import java.io.BufferedReader;
      import java.io.FileOutputStream;
      import java.io.FileReader;
      import java.util.regex.Pattern;
      import org.xml.sax.ContentHandler;
      import com.sun.org.apache.xml.internal.serialize.OutputFormat;
      import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
      import com.sun.xml.internal.bind.util.AttributesImpl;
      public class Item  {
      public static void main (String args[]) {
      item.readWrite("juin17.part","test.xml");
      }
    
      public static void readWrite(String fromFile, String toFile)  
      {
    try{
        Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
        BufferedReader in = new BufferedReader(new FileReader(fromFile));
        FileOutputStream fos = new FileOutputStream(toFile);
        OutputFormat of = new OutputFormat("XML","windows-1250",true);
        of.setIndent(1);
        of.setIndenting(true);
        XMLSerializer serializer = new XMLSerializer(fos,of);
        ContentHandler hd = serializer.asContentHandler();
        hd.startDocument();
        AttributesImpl atts = new AttributesImpl();
        hd.startElement("","","CONTACTS",atts);
        String line = null,tag;
        while ((line=in.readLine())!=null) {
            if(line.equals("Contact")){
                line=in.readLine();
                hd.startElement("","","CONTACT",atts);
                int i=0;
                while(!line.equals("Contact")){
                    if(i==0)
                        tag="FirstName";
                    else if(i==1)
                        tag="LastName";
                    else{
                        if(p.matcher(line).matches())
                            tag="EMail";
                        else
                            tag="URL";
                    }
                    hd.startElement("","",tag,atts);
                    hd.characters(line.toCharArray(),0,line.length());
                    hd.endElement("","",tag);
                    i++;
                    line=in.readLine();
                }
                hd.endElement("","","CONTACT");
            }
        }
        hd.endElement("","","CONTACTS");
        hd.endDocument();
        fos.close();
        in.close();
        }catch(Exception E){
            System.out.println("Cannot Generate XML!!!");
        }
    
      }
      }
    

    【讨论】:

    • 嗨,我如何导入这些文件?导入 com.sun.org.apache.xml.internal.serialize.OutputFormat;导入 com.sun.org.apache.xml.internal.serialize.XMLSerializer;导入 com.sun.xml.internal.bind.util.AttributesImpl;我是否必须导入 ant 库,因为我使用的是 eclipse。谢谢你。
    • 这些存在于 jdk 中 .. 除了添加行之外,您无需执行任何操作来导入它们。
    • 嗨,你设法得到输出了吗?我有一条错误消息:线程“主”java.lang.Error 中的异常:未解决的编译问题:无法在 Item.main 解决项目(Item.java:11)​​对所需库的访问限制。
    • 嗨 Balanivash,我添加了包 textparser;我改变了这个 Item.readWrite("D:/juin17.part","D:/juin17final.xml");它读取文件并将输出写入 juin17final.xml。非常感谢你:)
    • 嗨,最后一个问题!如何根据域选择电子邮件地址,例如@yahoo.com; @gmail.com 像这样:Rangarajkarthikkarthik RangarajYahookarthikrangaraj@yahoo.com Gmailkart2006@gmail.com 谢谢你。
    【解决方案3】:
        public static void readFile(File file)  {
        Scanner freader = new Scanner(file);
        String line = null;
        while (freader.hasNextLine()) {
            line = freader.nextLine();
           if(line==contact){
        Item item = new item();
            item.Name =freader.nextLine();
            item.LName =freader.nextLine();
            item.Email =freader.nextLine();
            freader.nextLine();
            }
            itemList.add(item);
        }
        freader.close();  
       }
    

    这将帮助您读取文件。这里的 Item 是一个带有 {Name,LName, Email} 的类,itemList 是一个数组列表,所以,第一部分我读取文件并将其存储在数组列表中,然后使用 arrayList 创建 XML 文件。尝试同时将读取和写入合并到 XML 中。

    【讨论】:

    • 比如你是怎么做的??合并读取文件和XML或文件读取
    • 请在阅读文件后解释一下,如何将其放入数组列表以及如何转换为 xml,然后如何保存 xml 文件。老实说,这是我在这里的第一种方法,我有点困惑。请给我一些更详细的信息。
    • 在上面的代码中,itemList.add() 将元素添加到arrayList中,而另一个答案中的代码,读取arrayList并创建xml文件,其他代码中的变量xml_file是最终的 xml 文件将被存储的地方
    • Balanviash,请检查我在顶部的问题。我确实放了代码。请纠正我这些错误。谢谢你。
    • 嗯..我要求您合并代码以同时进行读取和写入,而不是一个接一个地添加。我贴代码
    【解决方案4】:
    1. 您需要一个循环来逐行读取文件,为此我建议使用BufferedReader

    2. 在循环内部,您正在检查以“联系人”开头和结尾的行序列。其中每一个都是 XML Element。在这些序列中,您可以为每个数据项创建 XML Elements,即 Firstname、Secondname、Email、URL。

    3. 您可以通过尝试使用它创建InternetAddress 来检查该行是否为电子邮件地址。您可以通过尝试从中创建 URL 来检查某行是否为 URL。

    4. 有两种写入 XML 输出的策略。最简单的方法是在内存中构建整个 XML 文档,然后在完全读取输入文件后将其写入文件。如果您的输入文件非常大,这可能不实用,您可能需要在开始下一个联系人之前将每个联系人 Element 写入输出流。

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 2012-06-14
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 2016-07-21
      相关资源
      最近更新 更多