gpt4 book ai didi

java - 在使用 java 解析特定节点的 xml 后,尝试获取节点的下一个和 previous sibling 节点

转载 作者:行者123 更新时间:2023-11-30 11:09:06 25 4
gpt4 key购买 nike

我有一个包含 1000 个事件日志的 xml,其中每个事件都有一个键,我的目标是当用户搜索事件键时,我应该向他显示具有该键的事件节点的 xml 并准备上一个和下一个兄弟节点的信息。

xml结构如下:

<LOG>
<EVENT_SET>
<DOCGET system="T610_00" fingerPrint="NO_SIGNATURE">
<event>
<key>382</key>
<date>2015-01-28T09:15:15.350+0000</date>
<service>CORE</service>
<class>APPLICATION</class>
</event>
<document>
<docuri>getdocs:///DocMapCSDOCS.dPortal/1</docuri>
<sign_info>
<signature>VqtR9Gpny/MPE43/5o4hJXp8bR7gbsVUJqHlTI+VfztMSQecTpZwAQpxmorrdBJKvmn+h7eZzV1geVodkVECvOjQMRmRbnpT6mrpbiXxjDOsZsQRDNemTYUKETrQFIBRtXcjoP61une1LOsS5C749ehwbZ1jEaNH6fPjH4n+OH4=</signature>
</sign_info>
</document>
</DOCGET>
<DOCGET system="T610_00" fingerPrint="NO_SIGNATURE">
<event>
<key>383</key>
<date>2015-01-28T09:15:18.310+0000</date>
<service>CORE</service>
<class>APPLICATION</class>
</event>
<document>
<docuri>getdocs:///DocMapCSDOCS.dPortal/2</docuri>
<sign_info>
<signature>VqtR9Gpny/MPE43/5o4hJXp8bR7gbsVUJqHlTI+VfztMSQecTpZwAQpxmorrdBJKvmn+h7eZzV1geVodkVECvOjQMRmRbnpT6mrpbiXxjDOsZsQRDNemTYUKETrQFIBRtXcjoP61une1LOsS5C749ehwbZ1jEaNH6fPjH4n+OH4=</signature>
</sign_info>
</document>
</DOCGET>
.......
</EVENT_SET>
</LOG>

到目前为止,我获取 key 节点的代码是:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
//parsing the xml file
journaldoc = builder.parse(journalFile);
XPathFactory xpathfactory = XPathFactory.newInstance();
XPath xpath = xpathfactory.newXPath();

//xpath to search for the event having the key requated by the user
String sXpath = "//DOCGET[event/key='"+eventkey+"']";
XPathExpression expr = xpath.compile(sXpath);
Object result = expr.evaluate(journaldoc, XPathConstants.NODE);
Node eventnode = (Node) result;

//return to the user the xml part with root DOCGET, and having the key requested
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Node copyNode = document.importNode(eventNode, true);
document.appendChild(copyNode);
DOMImplementationLS domImplementationLS = (DOMImplementationLS) document.getImplementation();
LSSerializer lsSerializer = domImplementationLS.createLSSerializer();
String xmlNode = lsSerializer.writeToString(document);

现在我需要获取此节点的前一个和下一个兄弟节点并获取它们的键以便将它们保存在 HashMap 中。

问题是在执行 eventnode.getPreviousSibling 和 eventnode.getNextSibling 时,我得到的信息已损坏,我无法获得这些事件的 key 。

有没有人有更好的主意来做到这一点?

谢谢,卡琳娜

最佳答案

我认为您正在寻找 XPath 轴 preceding-siblingfollowing-sibling .这些选择同一级别的所有节点,因此如果您只想要下一个邻居,则需要添加一个谓词以仅选择第一个:following-sibling::*[1] .但是你只需要事件节点,事件节点不是直接的 sibling ,而是 <DOCGET>元素是。因此,您需要从事件节点向上移动,找到下一个/ previous sibling 节点,然后再次向下移动。这归结为这个表达式:../preceding-sibling::*[1]/event在事件节点上进行评估。

您可以使用 data projection 来简化任务(披露:我隶属于该项目)以面向对象的方式访问事件,但仍将 Java 代码结构与 XML 结构分离:

public class ReadEvents {

public interface Event {
@XBRead("./key")
String getKey();

@XBRead("./date using yyyy-MM-dd'T'HH:mm:ss.SSSZ")
Date getDate();

@XBRead("../document/docuri")
String getDocumentURI();

@XBRead("../preceding-sibling::*[1]/event")
Event getPreviousEvent();

@XBRead("../following-sibling::*[1]/event")
Event getNextEvent();
}

public static void main(String... args) {
List<Event> allEvents = new XBProjector().io().url("res://log.xml").evalXPath("//event").asListOf(Event.class);
for (Event event : allEvents) {
System.out.print(event.getDate()+ ": Event " + event.getKey());
if (event.getPreviousEvent() != null) {
System.out.print(" previous event has key " + event.getPreviousEvent().getKey());
}
if (event.getNextEvent() != null) {
System.out.print(" next event has key " + event.getNextEvent().getKey());
}
System.out.println();
}
}
}

对于您的示例,此程序打印出:

Wed Jan 28 10:15:15 CET 2015: Event 382 next event has key 383
Wed Jan 28 10:15:18 CET 2015: Event 383 previous event has key 382

关于java - 在使用 java 解析特定节点的 xml 后,尝试获取节点的下一个和 previous sibling 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28264585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com