我是Hadoop框架的新手.我试图编写一个从hdfs读取XML文件的程序,使用JDOM解析它并将其发送到数据库.以下是Java文件
package JDOMprs;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import com.vertica.hadoop.VerticaOutputFormat;
import com.vertica.hadoop.VerticaRecord;
public class ExampleParser extends Configured implements Tool {
public static class Map extends Mapper<LongWritable, Text, Text, DoubleWritable> {
private final static DoubleWritable one = new DoubleWritable(1);
private Text word = new Text();
private List mylist; …Run Code Online (Sandbox Code Playgroud) 我在Tomcat中运行Java Web应用程序.该应用程序使用Quartz框架定期调度cron作业.这个cron工作涉及解析4+ MB xml文件,我正在使用JDOM API.xml文件包含大约3600个要解析的节点,因此要在DB中更新数据,我按顺序执行此操作.
在解析了几乎一半的文件后,我的应用程序抛出了Out of Memory Exception.堆栈跟踪是:
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3210)
at java.lang.String.<init>(String.java:216)
at java.lang.StringBuffer.toString(StringBuffer.java:585)
at org.netbeans.lib.profiler.server.ProfilerRuntimeMemory.traceVMObjectAlloc(ProfilerRuntimeMemory.java:170)
at java.lang.Throwable.getStackTraceElement(Native Method)
at java.lang.Throwable.getOurStackTrace(Throwable.java:590)
at java.lang.Throwable.getStackTrace(Throwable.java:582)
at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:155)
at org.apache.juli.logging.DirectJDKLog.error(DirectJDKLog.java:135)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1603)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
at java.lang.Thread.run(Thread.java:619)
Exception in thread "*** JFluid Monitor thread ***" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.Vector.ensureCapacityHelper(Vector.java:226)
at java.util.Vector.add(Vector.java:728)
at org.netbeans.lib.profiler.server.Monitors$SurvGenAndThreadsMonitor.updateSurvGenData(Monitors.java:230)
at org.netbeans.lib.profiler.server.Monitors$SurvGenAndThreadsMonitor.run(Monitors.java:169)
Nov 30, 2009 2:22:05 PM org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor processChildren
SEVERE: Exception invoking periodic operation: …Run Code Online (Sandbox Code Playgroud) 我想使用JDOM从URL解析XML文件.但是在尝试这个时:
SAXBuilder builder = new SAXBuilder();
builder.build(aUrl);
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
Invalid byte 1 of 1-byte UTF-8 sequence.
Run Code Online (Sandbox Code Playgroud)
我认为这可能是BOM问题.所以我查看了源代码并在文件开头看到了BOM.我尝试使用aUrl.openStream()Commons IO BOMInputStream从URL读取和删除BOM .但令我惊讶的是它没有检测到任何BOM.我尝试从流中读取并写入本地文件并解析本地文件.我将InputStreamReader和OutputStreamWriter的所有编码设置为UTF8但是当我打开文件时它有疯狂的字符.
我认为问题在于源URL编码.但是当我在浏览器中打开URL并将XML保存在文件中并通过上述过程读取该文件时,一切正常.
我对此问题的可能原因表示感谢.
它们有什么区别?据说JAXP只是一个API规范,JDOM和DOM4J实现了它,是不是?所有这些都需要一个XML解析器,就像XERCES一样,是不是?提前致谢!
我使用JDom进行XML解析/格式化.我想将长行的属性分成几行.
喜欢 :
<node att1="Foo" att2="Bar" att3="Foo" />
Run Code Online (Sandbox Code Playgroud)
进入:
<node
att1="Foo"
att2="Bar"
att3="Foo" />
Run Code Online (Sandbox Code Playgroud)
根据JDom FAQ,JDom可以转换为标准DOM和SAX事件.因此,任何支持SAX或DOM并且能够进行如此漂亮渲染的渲染器都会非常棒.
提前致谢.
我有一个进程使用JDOM和xpath解析XML文件来解析文件,如下所示:
private static SAXBuilder builder = null;
private static Document doc = null;
private static XPath xpathInstance = null;
builder = new SAXBuilder();
Text list = null;
try {
doc = builder.build(new StringReader(xmldocument));
} catch (JDOMException e) {
throw new Exception(e);
}
try {
xpathInstance = XPath.newInstance("//book[author='Neal Stephenson']/title/text()");
list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
throw new Exception(e);
}
Run Code Online (Sandbox Code Playgroud)
以上工作正常.xpath表达式存储在属性文件中,因此可以随时更改这些表达式.现在我必须处理更多来自遗留系统的xml文件,该系统只会以4000字节的块发送xml文件.现有处理读取4000字节块并将它们存储在Oracle数据库中,每个块作为数据库中的一行(对遗留系统进行任何更改或将块存储为数据库中的行的处理是不可能的) .
我可以通过提取与特定xml文档相关的所有行并合并它们然后使用现有处理(如上所示)来解析xml文档来构建完整的有效XML文档.
但事实是,我需要从XML文档中提取的数据始终位于前4000个字节上.这个大块的课程不是一个有效的XML文档,因为它不完整但会包含我需要的所有数据.由于JDOM构建器拒绝它,我无法解析一个块.
我想知道我是否可以解析格式错误的XML块而不必合并所有部分(可能会有很多部分)以获得有效的XML文档.这将节省我几次到数据库的行程,以检查一个块是否可用,并且我不必合并100个块只是为了能够使用前4000个字节.
我知道我可能会使用java的字符串函数来提取相关数据但这可能是使用解析器甚至xpath吗?或者他们都希望xml文档在解析之前是一个格式良好的文档?
我正在使用import org.jdom在java中编写应用程序.*;
我的XML有效,但有时它包含HTML标记.例如,像这样:
<program-title>Anatomy & Physiology</program-title>
<overview>
<content>
For more info click <a href="page.html">here</a>
<p>Learn more about the human body. Choose from a variety of Physiology (A&P) designed for complementary therapies.&#160; Online studies options are available.</p>
</content>
</overview>
<key-information>
<category>Health & Human Services</category>
Run Code Online (Sandbox Code Playgroud)
所以我的问题是overview.content节点内的<p>标签.
我希望这段代码可行:
Element overview = sds.getChild("overview");
Element content = overview.getChild("content");
System.out.println(content.getText());
Run Code Online (Sandbox Code Playgroud)
但它返回空白.
如何从overview.content节点返回所有文本(嵌套标签和所有文本)?
谢谢
我使用 XMLOutputter 编写 xml 文件,然后在 android 中使用它。当文件被写入时,字符串
<string name="sname"><u>Text</u></string>
Run Code Online (Sandbox Code Playgroud)
写成
<string name="sname"><u>Text<u></string>
Run Code Online (Sandbox Code Playgroud)
我从数据库读取“<u>Text<u>”,然后将其放入jdom文档中。然后我使用编写文档
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
Writer writer = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
outputter.output(doc, writer);
writer.close();
Run Code Online (Sandbox Code Playgroud)
如何防止转义并将准确的字符串从数据库放入文件?(我想要有“<”,而不是<那里)
我当前的代码是这样打印出xml:
<type xmlns="http://www.example.com">
<OBJECT_TYPE xmlns="">x3000</OBJECT_TYPE>
- <prop xmlns="">
<DESCRIPTION>a very fast train</DESCRIPTION>
<PARENT>NULL</PARENT>
<VIRTUAL>0</VIRTUAL>
<VISIBLE>1</VISIBLE>
<PICTURE>NULL</PICTURE>
<HELP>NULL</HELP>
<MIN_NO>NULL</MIN_NO>
<MAX_NO>NULL</MAX_NO>
<NAME_FORMAT>NULL</NAME_FORMAT>
</prop>
</type>
Run Code Online (Sandbox Code Playgroud)
但我想要这个输出:
<type xmlns="http://www.example.com">
<OBJECT_TYPE>x3000</OBJECT_TYPE>
- <prop>
<DESCRIPTION>a very fast train</DESCRIPTION>
<PARENT>NULL</PARENT>
<VIRTUAL>0</VIRTUAL>
<VISIBLE>1</VISIBLE>
<PICTURE>NULL</PICTURE>
<HELP>NULL</HELP>
<MIN_NO>NULL</MIN_NO>
<MAX_NO>NULL</MAX_NO>
<NAME_FORMAT>NULL</NAME_FORMAT>
</prop>
</type>
Run Code Online (Sandbox Code Playgroud)
怎么做 ?这是我目前的代码:
public void saveXmlToFile(Type objType, Properties property)
throws IOException, ParserConfigurationException, SAXException,
JDOMException {
File xmlFile = new File(XMLEditorService.getXMLEditorService()
.getFile());
org.jdom2.Document doc = new SAXBuilder().build(xmlFile);
Element root = doc.getRootElement();
Namespace ns = Namespace.getNamespace("http://www.example.com");
Element type = new Element("type"); …Run Code Online (Sandbox Code Playgroud) 我正在尝试对maven使用的"正确"pom.xml执行一些检索查询.为此我使用JDOM的基本XPath查询.
不幸的是,查询不返回任何结果(简单的后代过滤器也没有).我有理由相信问题在于pom.xml的根声明:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!-- content -->
</project>
Run Code Online (Sandbox Code Playgroud)
可以看出一个空的命名空间定义不匹配或者""还是"http://www.w3.org/2000/xmlns/",其中""是默认的无命名空间和命名空间的xmlns是默认的xmlns命名空间.
所以给定一个Document,当我想执行XPath-Query时,如下所示:
XPathBuilder<Element> depQueryBuilder = new XPathBuilder<>("//dependencies/dependency", Filters.element());
XPathExpression<Element> depQuery = depQueryBuilder.compileWith(XPathFactory.instance());
for (Element elem : depQuery.evaluate(document)) {
// basically unreachable, since the resultset is always empty
}
Run Code Online (Sandbox Code Playgroud)
鉴于所有XPath表达式和查询都需要知道名称空间(比较XPathHelper javadoc),我很确定我可以通过添加必需的名称空间声明来实现这一点.
我尝试了以下不同类型的失败:
depQueryBuilder.setNamespace("", document.getRootElement().getAttributeValue("xmlns"));
// NPE: Null URI
depQueryBuilder.setNamespace("", "http://maven.apache.org/POM/4.0.0");
// Cannot set a Namespace URI in XPath for "" prefix
depQueryBuilder.setNamespace(Namespace.NO_NAMESPACE);
// no error-message, but no results either
depQueryBuilder.setNamespace(document.getRootElement().getNamespace("xmlns"));
// …Run Code Online (Sandbox Code Playgroud)