在apache beam中使用XmlIo读取xml文件。

问题描述 投票:0回答:1

问题陈述:我正试图使用direct runner在beam中读取和打印xml文件的内容,以下是代码片段。

 public  class  BookStore{

 public  static  void  main  (string  args[]){

 BookOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(BookOptions .class); 

 Pipeline pipeline = Pipeline.create(options);

 PCollection<Book> output = pipeline.apply(XmlIO.<Book>read().from("sample.xml")
                 .withRootElement("book") 
                 .withRecordElement("name")
                 .withRecordClass(Book.class));  

         output.apply(ParDo.of(new DoFn<Book,String>(){
             @ProcessElement 
             public void processElement(ProcessContext c)
             {
                 System.out.println("xml  data "+c.element().getname());    
             }
          }));
 pipeline.run();
}
}

我的pojo类:


@XmlRootElement(name = "book")
@XmlType(propOrder = {"name"})
public class Book{

    private String name;
    @XmlElement(name = "name")
    public String getName ()
    {
    return name;
    }

    public void setName (String name)
    {
    this.name = name;
    }

    @Override
    public String toString()
    {
    return "ClassPojo [name= "+name+"]";
    }

}

我的sample.xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<book>
   <name>Harrypotter</name>
</book>

当我使用直接运行器执行上述代码时,我得到的 "name "的输出为null

有人能指导我吗?

有没有什么例子可以参考......?

java jaxb apache-beam apache-beam-io
1个回答
0
投票

你的xml文件不符合 XmlIO 你在管道中定义的选项--你需要有一个包括你的记录(书籍)的根元素。其中一个解决方案可以是这样的。

PCollection<Book> output = pipeline.apply(
        XmlIO.<Book>read().from("sample.xml")
            .withRootElement("books")
            .withRecordElement("book")
            .withRecordClass(Book.class));

和XML文件应该是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book>
        <name>Harrypotter</name>
    </book>
</books>
© www.soinside.com 2019 - 2024. All rights reserved.