xmlparser失败,并显示以下消息:实体名称必须紧跟实体引用中的“&”

mhd8tkvw  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(304)

我一直在hadoop集群上执行分布式xml解析。我在map reduce程序中使用这个xmlinputformat。它工作得很好,我衷心感谢那个贡献者。
但是,我遇到了一个问题:
在测试这几个map-red作业时,出现了以下xmlstreamexception错误。

java.io.IOException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[21,69]
Message: The entity name must immediately follow the '&' in the entity reference.
at org.apache.hadoop.examples.XMLRecordCount$Map.map(XMLRecordCount.java:197)
at org.apache.hadoop.examples.XMLRecordCount$Map.map(XMLRecordCount.java:1)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:214)
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[21,69]
Message: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:594)
at org.apache.hadoop.examples.XMLRecordCount$Map.map(XMLRecordCount.java:168)

据我所知,这是由于数据中的字符造成的。例如- "<name>Alen & Bob </name>" 我正在处理包含上述数据的日志。但正因为如此,整个工作都失败了。
我可以认为预处理是一种解决方案,但对我来说可能不是一个有效的选择。
你能给我建议一种方法吗?通过这种方法,我可以跳过这样的坏记录/或者只是在javaxmlapi中替换这样的字符?

0s0u357o

0s0u357o1#

如果您使用的是前面提到的xmlparser11.java,您可能会这样做—您可以替换document string对象中的'&',例如:

document = document.replace("&", "your_desired_working_string_here");
...
...
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new
                      ByteArrayInputStream(document.getBytes()));

然后在从map()发射时,您可以再次替换 "your_desired_working_string_here"'&' .
希望有帮助。

g52tjvyc

g52tjvyc2#

而不是 & 在xml中,尝试使用 &amp; . i、 e.代替 <name>Alen & Bob </name><name>Alen &amp; Bob </name>

uqdfh47h

uqdfh47h3#

map 函数(在您发布的示例中),而不是捕获和重试任何异常,只需捕获 XMLStreamException 什么也不做。什么都不会被释放,工作也不会失败。不过,您可能需要增加一个计数器来跟踪无效记录。
伪代码:

protected void map(LongWritable key, Text value, Mapper.Context context) throws IOException
      try {
          XMLStreamReader reader = ...
          context.write(...);
      } catch(XMLStreamException e){
            // do nothing
            context.getCounter(INVALID_RECORDS).increment(1);
      }
  }

相关问题