gpt4 book ai didi

xpath - 模拟 HttpServlet 响应 : Checking xml content

转载 作者:行者123 更新时间:2023-12-03 16:33:43 26 4
gpt4 key购买 nike

我正在使用 MockMvc 测试 Controller 。这是响应的样子:

MockHttpServletResponse:
Status = 200
Error message = null
Headers = {Content-Type=[text/xml]}
Content type = text/xml
Body = <?xml version="1.0" encoding="UTF-8" standalone="yes"?><ns2:diagnosisCode xmlns:ns2="http://schemas.mycompany.co.za/health" effectiveStartDate="2014-03-05T00:00:00+02:00" effectiveEndDate="2014-03-05T23:59:59.999+02:00" diagnosisId="1"><diagnosisCodeId><codingSchemaCode>irrelevant schema</codingSchemaCode><diagnosisCode>irrelevant code</diagnosisCode></diagnosisCodeId></ns2:diagnosisCode>
Forwarded URL = null
Redirected URL = null
Cookies = []

Body 行的精美打印版本:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:diagnosisCode xmlns:ns2="http://schemas.mycompany.co.za/health" effectiveStartDate="2014-03-05T00:00:00+02:00" effectiveEndDate="2014-03-05T23:59:59.999+02:00" diagnosisId="1">
<diagnosisCodeId>
<codingSchemaCode>irrelevant schema</codingSchemaCode>
<diagnosisCode>irrelevant code</diagnosisCode>
</diagnosisCodeId>
</ns2:diagnosisCode>

MockMvc 的调用看起来像

mockMvc.perform(
get("/diagnostic/diagnosisCodes/{schema}/{code}", IRRELEVANT_SCHEMA, IRRELEVANT_CODE).accept(MediaType.TEXT_XML))
.andDo(print())
.andExpect(content().contentType(MediaType.TEXT_XML))
.andExpect(status().isOk())
.andExpect(xpath("diagnosisCodeId/diagnosisCode").string(IRRELEVANT_CODE))
.andExpect(xpath("diagnosisCodeId/codingSchemaCode").string(IRRELEVANT_SCHEMA));

我很确定我误解了我应该如何在这里使用 XPath,但为什么这个断言失败了?我的期望应该是什么样的?

java.lang.AssertionError: XPath diagnosisCode expected:<irrelevant code> but was:<>

最佳答案

我不完全确定 XPath 上下文是什么(或者它是否是文档节点),但我看到两个可能的问题并猜测都适用:

  • 您尝试匹配 < diagnosisCodeId/>作为根元素的元素。没有,但他们是 <diagnosisCode> 的 child .为根节点包含一个轴步骤(可能是更好的方法)或使用 descendant-or-self轴步 //在查询前面。

    /diagnosisCode/diagnosisCodeId/diagnosisCode
    //diagnosisCodeId/diagnosisCode
  • 文档使用命名空间(用于根元​​素)。除了上述根元素问题之外,注册该命名空间(更好的解决方案,但我不知道如何在 spring MVC 中执行此操作)或使用以下解决方法忽略它:

    /*[local-name() = 'diagnosisCode']/diagnosisCodeId/diagnosisCode

    首先匹配所有子节点,然后限制为具有适当元素名称的子节点(忽略命名空间)。

    通过添加 XPath 2.0 支持(例如 by including Saxon as library ),您还可以使用通配符命名空间匹配器:

    /*:diagnosisCode/diagnosisCodeId/diagnosisCode

    如果注册命名空间 URI http://schemas.mycompany.co.za/health作为ns2 ,查询看起来像

    /ns2:diagnosisCode/diagnosisCodeId/diagnosisCode

关于xpath - 模拟 HttpServlet 响应 : Checking xml content,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202254/

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