我正在尝试使用StAX(我已经不喜欢它……)

似乎使用它的唯一方法是通过连续的if-else条件.

但最重要的是,似乎没有办法将元素与其子元素相关联,除非事先知道它

正在解析的xml文档的结构.这是正确的吗?

我尝试过以下方法:

我在String中有这个xml

John

1

Small Publishing House

37.8

我想使用StAX来获取Book元素,但似乎我只能编写硬编码所有结构的代码.

即使用XMLEventReader和一次

你得到Book,开始循环数据,作者等.

对此有通用的解决方案吗?

我尝试了以下内容来解决这个问题:我试图从String转到XMLEventReader并返回String但我无法获得我最初使用的确切的String表示(名称空间在括号中,额外的冒号等).

StringBuilder xml = new StringBuilder();

XMLInputFactory inputFactory = XMLInputFactory.newInstance();

String msg = "John1Small Publishing House37.8";

InputStream input = new ByteArrayInputStream(msg.getBytes("UTF-8"));

XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);

while (xmlEventReader.hasNext())

{

XMLEvent event = xmlEventReader.nextEvent();

StringWriter sw = new StringWriter();

event.writeAsEncodedUnicode(sw);

xml.append(sw);

}

System.out.println(xml);

我得到以下内容:

<?xml version="1.0" encoding='UTF-8' standalone='no'?>John1Small Publishing House37.8

这种情况可以通过StAX解决,还是DOM是唯一的解决方案?

解决方法:

我真的不明白你要做什么,但如果你想要标签的本地名称导致START_ELEMENT事件,你可以这样做:

if (event.getEventType() == START_ELEMENT) {

QName qname = event.asStartElement().getName()

System.out.println("Start of element " + qname.getLocalPart());

}

就个人而言,我通常会发现XMLStreamReader在大多数情况下对我来说更方便,但我认为这取决于用例以及您自己的个人偏好.专家提示,架构越严格,使用StAX解析数据就越容易.

您可能还希望查看JAX-B以获取自动XML数据绑定.

编辑:这是OP中XML的一个天真的递归下降StAX解析器:

@Test

public void recursiveDescentStaxParser( ) throws XMLStreamException,

FactoryConfigurationError

{

String msg = "John1Small Publishing House37.8";

XMLStreamReader reader = XMLInputFactory.newFactory( )

.createXMLStreamReader( new StringReader( msg ) );

reader.nextTag( );

readRoot( reader );

}

private void readRoot( XMLStreamReader reader ) throws XMLStreamException

{

while ( reader.nextTag( ) == XMLEvent.START_ELEMENT )

{

QName name = reader.getName( );

if ( "B".equals( name.getLocalPart( ) ) )

readBooks( reader );

else

reader.nextTag( ); // Empty

}

}

private void readBooks( XMLStreamReader reader ) throws XMLStreamException

{

while ( reader.nextTag( ) == XMLEvent.START_ELEMENT )

{

QName name = reader.getName( );

if ( !"Book".equals( name.getLocalPart( ) ) )

throw new XMLStreamException( name.toString( ) );

reader.nextTag( ); // Jump to

readBook( reader );

reader.nextTag( ); // Jump to

}

}

private void readBook( XMLStreamReader reader ) throws XMLStreamException

{

reader.nextTag( ); // Skip to

System.out.println( "Author: " + reader.getElementText( ) );

reader.nextTag( ); // Skip to

System.out.println( "Edition: " + reader.getElementText( ) );

reader.nextTag( ); // Skip to

System.out.println( "Publisher: " + reader.getElementText( ) );

reader.nextTag( ); // Skip to

System.out.println( "Price: " + reader.getElementText( ) );

reader.nextTag( ); // Skip to

}

写这样的东西不仅使代码更易于阅读和推理,而且还会在错误弹出时出现堆栈跟踪.

标签:java,dom,stax,jaxp

来源: https://codeday.me/bug/20190606/1189288.html

java怎么取子标签,java使用StAX以通用方式获取子元素相关推荐

  1. java中写html标签,java写html剔出标签

    java写html剔出标签 [2021-02-04 19:54:11]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

  2. java抓取网页css,Java 读取网页Html资料

    当前位置:我的异常网» HTML/CSS » Java 读取网页Html资料 Java 读取网页Html资料 www.myexceptions.net  网友分享于:2013-10-27  浏览:13 ...

  3. vue 子级拿值_Vue 父组件主动获取子组件的值,子组件主动获取父组件的值

    父组件主动获取子组件的值 1. 在调用子组件的时候定义一个ref-> ref="header" 2. 在父组件中通过this.$refs.header.属性,调用子组件的属性 ...

  4. 使用IndicatorFragmentActivity添加子级Fragment时,在Activity中获取子级的方法

    MainActivity FragmentTransaction transaction=getSupportFragmentManager().beginTransaction();//这里的fra ...

  5. java 抓取百度新闻,java中使用jdom生成百度新闻抓取的xm

    百度新闻开放,详细见 plaincopy to clipboardprint? 自己用java写了个使用jdom生成百度要求的 xml文件 的实例,生成供百度搜索引擎抓取新闻 package com. ...

  6. scrapy 爬取论坛帖子名称及链接(递归方式获取)

    本文主要爬取西安论坛帖子,如果要爬取内容及评论热度等可以再深入爬取 首先建立spider xi'an,命令 scrapy genspider xian ixian.com xian.py内容: imp ...

  7. html页面取js里面的值,如何在javascript中获取HTML元素的样式值?

    这个element.style属性只让您知道定义为内联在该元素(以编程方式或在元素的样式属性中定义)中,您应该获得计算样式. 用跨浏览器的方式做它并不容易,IE有自己的方式,通过element.cur ...

  8. mysql获取终节点_mysql 函数获取子节点

    DELIMITER $$ USE `topsale`$$ DROP FUNCTION IF EXISTS `getShopIdByUserId`$$ CREATE DEFINER=`root`@`%` ...

  9. 16 `bs对象.节点名div.属性contents` children descendants 获取子节点 子孙节点

    16 bs对象.节点名div.属性contents children descendants 获取子节点 子孙节点 文章目录 16 `bs对象.节点名div.属性contents` children ...

最新文章

  1. Reverse String
  2. CTFshow php特性 web108
  3. MYSQL不同字段之间四则运算
  4. java实现poi导入excel_Java POI实现将导入Excel文件的示例代码
  5. linux中进程pts 1和pts 3,termial创建时ptmx与pts的关系
  6. mui案例:导航栏 颜色渐变
  7. php图片案例,web开发N例-案例2:PHP绘制图片、绘制中文
  8. redis 所有模糊key 查询_写完这篇Redis由浅入深剖析快自闭了!
  9. mac使用eclipse创建java_【Java】Mac上使用Eclipse创建Java项目的一般步骤
  10. java boolean 包_java Boolean包装类工作笔记
  11. 《Java程序员职场全功略:从小工到专家》连载四:IT人不容易
  12. mybatis 高级映射和spring整合之与Spring整合(6)
  13. 【二 HTTP编程】2. HTTP路由
  14. spring扩展点六:监听spring容器刷新事件
  15. 0708-/etc/login.defs
  16. 阅读分享——李开复老师《开工愉快:如何保持每天精力充沛》
  17. 是什么原因才导致网站打开速度慢?
  18. 物联网到底为什么这么火?
  19. android 取消系统默认手机加密(全盘加密)
  20. 好用速度又快,多御安全浏览器下载安装教程

热门文章

  1. AR模型的R语言实现
  2. Oracle游标设置
  3. 邀您免费加入到程序猿小密圈
  4. 点读机一般具备以下几大特点
  5. (二)员工管理系统(超级详细代码)
  6. itk中的数据孔洞填充
  7. 无向连通图的割点和桥
  8. 华为机试——五分制成绩:break和continue的区分
  9. 简单几行代码看两个机器人尬聊
  10. 8F51单片机IC芯片MCU资料规格书8位PWM单片机 集成电路芯片