百里晓生 2022-03-01 22:07 采纳率: 0%
浏览 11

dom4j解析xml

问题遇到的现象和发生背景

dom4j解析xml 获取节点的全部路径
结果就是子节点的属性字段名不能跟父的一样

问题相关代码,请勿粘贴截图
<?xml version="1.0" encoding="utf-8"?>

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <hgwTerminalRestartResponse xmlns="http://www.example.org/MobileLoadingMachine/">
      <responseStr xmlns="">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;root&gt;&lt;resultCode&gt;3&lt;/resultCode&gt;&lt;/root&gt;</responseStr>
    </hgwTerminalRestartResponse>
  </soapenv:Body>
</soapenv:Envelope>


运行结果及报错内容

运行结果:
/soapenv:Envelope
/soapenv:Envelope/soapenv:Body
/soapenv:Envelope/soapenv:Body/[name()='hgwTerminalRestartResponse']
/soapenv:Envelope/soapenv:Body/
[name()='hgwTerminalRestartResponse']/responseStr
后面body的有问题

我的解答思路和尝试过的方法

多次尝试:把hgwTerminalRestartResponse xmlns改成xmlns1 和responseStr的xmlns改成xmlns2结果就可以了,为什么会这样
还有就是如果不改这个xmlns的名称怎么解析。

我想要达到的结果

预期达到的效果
/soapenv:Envelope
/soapenv:Envelope/soapenv:Body
/soapenv:Envelope/soapenv:Body/hgwTerminalRestartResponse
/soapenv:Envelope/soapenv:Body/hgwTerminalRestartResponse/responseStr

  • 写回答

1条回答 默认 最新

  • Dream丶大辉 2022-03-02 11:03
    关注

    这是dom4j解析的默认设置:getPath()方法最终走到类AbstractElement这里:

    /**
         * Returns the XPath expression to match this Elements name which is
         * getQualifiedName() if there is a namespace prefix defined or if no
         * namespace is present then it is getName() or if a namespace is defined
         * with no prefix then the expression is [name()='X'] where X = getName().
         *
         * @return DOCUMENT ME!
         */
        public String getXPathNameStep() {
            String uri = getNamespaceURI();
    
            if ((uri == null) || (uri.length() == 0)) {
                return getName();
            }
    
            String prefix = getNamespacePrefix();
    
            if ((prefix == null) || (prefix.length() == 0)) {
                return "*[name()='" + getName() + "']";
            }
    
            return getQualifiedName();
        }
    
    

    看一下注释,或者if-else走一走就知道了

    评论

报告相同问题?

问题事件

  • 创建了问题 3月1日

悬赏问题

  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目