当前位置: 首页 > 知识库问答 >
问题:

log4j上的XPath。使用VTD-xml的xml

郑衡
2023-03-14

我有这样的validLog4jXML字符串

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE log4j:eventSet PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd" >
<log4j:eventSet version="1.2" xmlns:log4j="http://jakarta.apache.org/log4j/" includesLocationInfo="true">
    <log4j:event logger="org.apache.axis2.deployment.ClusterBuilder" 
        timestamp="1395925603261" level="INFO" thread="localhost-startStop-1">
        <log4j:message>
            <![CDATA[Clustering has been disabled]]>
        </log4j:message>
    </log4j:event>
</log4j:eventSet>

我尝试运行以下代码

VTDGen doc = new VTDGen();
doc.setDoc(validLog4jXML.getBytes());
doc.parse(true);
VTDNav vn = doc.getNav();
AutoPilot ap = new AutoPilot(vn);
String xPath = "//log4j:event[(((@level=\"INFO\") or (@level=\"ERROR\")) and "
            + "(@timestamp>\"1395842943674\")) and (@timestamp<\"1396015743674\")]";
ap.selectXPath(xPath);

在最后一行,我得到了例外:

[ERROR] No URL found for prefix:log4j
com.ximpleware.XPathParseException: No URL found for prefix:log4j
    at com.ximpleware.xpath.CUP$parser$actions.CUP$parser$do_action(parser.java:752)
    at com.ximpleware.xpath.parser.do_action(parser.java:434)
    at java_cup.runtime.lr_parser.parse(lr_parser.java:570)
    at com.ximpleware.AutoPilot.selectXPath(AutoPilot.java:809)
    at ad.ecs.library.LogHelper.collectLogNodesVTD(LogHelper.java:654)
    at ad.ecs.library.LogHelper.collectLogNodesForADayVTD(LogHelper.java:571)
    at ad.ecs.library.LogHelper.collectLogNodesForTheWeekVTD(LogHelper.java:456)
    at ad.ecs.library.LogHelper.access$2(LogHelper.java:453)
    at ad.ecs.library.LogHelper$2.run(LogHelper.java:313)
    at java.lang.Thread.run(Thread.java:724)

我试图查看关于VTD-XML的文档,它说:

为避免此异常:

com.ximpleware。XPathParseException:未找到前缀xyz的URL

确保创建具有命名空间支持的初始navigator对象(即,最后一个参数设置为true),并将命名空间哈希作为最终参数传递,以查找索引、第一个匹配、所有匹配、获取xml和获取哈希。

我四处摸索,试图遵循这些步骤,但没有成功。如果有任何帮助,我将不胜感激。

共有1个答案

隗轶
2023-03-14

在查询中使用名称空间之前,必须先注册名称空间,然后使用declarexpachnamespace:

ap.declareXPathNameSpace(log4j, "http://jakarta.apache.org/log4j/");
 类似资料:
  • 我必须在这个xml中设置“count”属性的值: 我想使用这样的代码(VTDXML库)使用“Foo”更改myCount值: 这样我反而获得了 那不是我的目标因为我想要的是

  • VTD-XML是一种新的XML处理API,它能够克服DOM和SAX的一些问题。VTD-XML能够在内存中对XML进行快速检查并提供XPath查询支持。 在它的主页上有详细的API描述,源代码,文档和例子。

  • 为了在巨大的xml文件中执行XPATH查询,我阅读了许多喜欢VTD-xml的文章,因此我复制了这些文章中的代码: 但当我运行它时没有结果,所以这意味着XML文件没有映射到内存中。。。我的问题是如何在VTD-xml中强制映射xml文件?

  • 问题内容: 我如何在Java或C中使用vtd-xml解析如下的xml文件? 任何帮助,将不胜感激。 谢谢 问题答案: 我想其中有些取决于您要如何解析文件。 这是一个“非生产”示例,其中使用了一些有用的技术,包括: XPath选择(此处仅使用“ / *”) 浏览所有同级节点 通过子节点向下看 使用AutoPilot将节点属性提取到地图中 希望能帮助到你 产生以下输出: 添加带有AutoPilot循环

  • 如何在java或C中使用vtd xml解析如下xml文件? 任何帮助都将不胜感激。 谢谢

  • 有人能举一个例子,说明在VTD XML解析器中使用联合运算符(|)吗?以下内容不适用于VTD XML解析器,但适用于jxpath解析器/a |/b