Java使用StAX读取XML事件时如何去除命名空间获取值
根因说明
你看到的['http://aaa.en/ccc']::前缀,是StAX解析器中XMLEvent.toString()的默认调试输出格式——当解析器内部为元素关联了命名空间上下文、但未配置对应命名空间前缀时,就会把完整的命名空间URI按这种非标准格式拼接在元素名前。要输出不带命名空间标识的纯XML内容,绝对不能直接将XMLEvent对象append到字符串中,需要从事件实例中手动提取本地名称重新拼接合法XML片段。
代码修改方案
替换原有循环逻辑,按事件类型分别处理内容:
StringBuilder strBuilderEvent = new StringBuilder(); // 按原始XML格式保留头声明 strBuilderEvent.append("<?xml version=\"1.0\" encoding='UTF-8'?>\n"); while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); // 跳过解析器自动生成的文档声明事件,避免重复输出 if (event.isStartDocument()) { continue; } // 拼接开始标签 if (event.isStartElement()) { String elementLocalName = event.asStartElement().getName().getLocalPart(); strBuilderEvent.append("<").append(elementLocalName).append(">"); } // 拼接元素内文本 else if (event.isCharacters()) { strBuilderEvent.append(event.asCharacters().getData().trim()); } // 拼接结束标签 else if (event.isEndElement()) { String elementLocalName = event.asEndElement().getName().getLocalPart(); strBuilderEvent.append("</").append(elementLocalName).append(">").append("\n"); } }
输出效果
运行后会生成和你预期完全一致的内容,不会出现多余的命名空间标识:
<idObjet>ABC</idObjet> <thematique>10</thematique>
补充提示
XMLEvent.toString()的设计目的是方便开发调试,生成的是解析器内部的对象表示,不是可对外输出的合法XML格式- 如果后续需要处理带属性的元素,可以通过
event.asStartElement().getAttributes()遍历提取属性值,同样用本地名称拼接成标准的attr="value"格式即可
内容的提问来源于stack exchange,提问作者Software14
相关产品推荐
相关产品推荐

