问题陈述:我正试图使用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
有人能指导我吗?
有没有什么例子可以参考......?
你的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>