java xml 查询_通过Java中的行号和行位置检索XML节点

我们正在接收根据规范有效的XML文件。有一个外部人员检查原始XML文件并根据XML文件的内容生成警告。如果有警告,将产生两个文件:

原始XML文件。

带有与XML文件相关的警告/错误的文件。

问题在于,每次警告时,它们都会通过行号和行位置在原始文件中引用该警告。

78

10

不幸的是,我们对此无能为力,因为它写在规范中,它应该表现得像这样。我在互联网上搜索示例,但没有很多东西可以满足我的要求。

我发现的资源是:

这些帖子中提供的解决方案不理想或不存在。我想知道人们是否曾经这样做过,并提出了一个好的解决方案。

编辑:

为了帮助人们,我找到了解决方案。它基本上执行以下操作:指定行号,它将打印出开始元素的信息。

public class ParsingByLineNumberApplication {

/**

* URL's gebruikt ter inspiratie voor dit project.

*

* How should I use line number and column number to get element in XML in JAVA

* https://stackoverflow.com/questions/41225724/how-should-i-use-line-number-and-column-number-to-get-element-in-xml-in-java

*

* Java / Groovy : Find XML node by Line number

* https://stackoverflow.com/questions/47701357/java-groovy-find-xml-node-by-line-number

*

* Parsing XML documents partially with StAX

* https://www.ibm.com/developerworks/library/x-tipstx2/index.html

*

* @param args

* @throws FileNotFoundException

* @throws XMLStreamException

* @throws URISyntaxException

*/

public static void main(String[] args) throws FileNotFoundException, XMLStreamException, URISyntaxException {

printElementsAtLineNumber(53);

}

private static void printElementsAtLineNumber(int lineNumber) throws URISyntaxException, FileNotFoundException, XMLStreamException {

URL resource = ParsingByLineNumberApplication.class.getClassLoader().getResource("test_file.XML");

FileReader reader = new FileReader(new File(resource.toURI()));

XMLInputFactory factory = XMLInputFactory.newInstance();

XMLStreamReader xmlr = factory.createXMLStreamReader(reader);

// Create a filtered stream reader

XMLStreamReader xmlfr = factory.createFilteredReader(xmlr, filter);

// Main event loop

while (xmlfr.hasNext()) {

// Process single event

if (xmlfr.getEventType() == XMLStreamConstants.START_ELEMENT) {

if (lineNumber == xmlfr.getLocation().getLineNumber()) {

System.out.println("Character offset: " + xmlfr.getLocation().getCharacterOffset());

System.out.println("Column number: " + xmlfr.getLocation().getColumnNumber());

System.out.println("Element name: " + xmlfr.getName().getLocalPart());

System.out.println("Line number: " + xmlr.getLocation().getLineNumber());

System.out.println("Element text: " + xmlr.getElementText());

}

}

// Move to next event

xmlfr.next();

}

}

private static QName[] exclude = new QName[]{

new QName("invoice"), new QName("item")};

private static StreamFilter filter = new StreamFilter() {

// Element level

int depth = -1;

// Last matching path segment

int match = -1;

// Filter result

boolean process = true;

// Character position in document

int currentPos = -1;

public boolean accept(XMLStreamReader reader) {

// Get character position

Location loc = reader.getLocation();

int pos = loc.getCharacterOffset();

// Inhibit double execution

if (pos != currentPos) {

currentPos = pos;

switch (reader.getEventType()) {

case XMLStreamConstants.START_ELEMENT:

// Increment element depth

if (++depth < exclude.length && match == depth - 1) {

// Compare path segment with current element

if (reader.getName().equals(exclude[depth]))

// Equal - set segment pointer

match = depth;

}

// Process all elements not in path

process = match < exclude.length - 1;

break;

// End of XML element

case XMLStreamConstants.END_ELEMENT:

// Process all elements not in path

process = match < exclude.length - 1;

// Decrement element depth

if (--depth < match)

// Update segment pointer

match = depth;

break;

}

}

return process;

}

};

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值