【问题标题】:How to get test value from CDATA in xml file using java如何使用java从xml文件中的CDATA获取测试值
【发布时间】:2020-02-19 14:10:39
【问题描述】:

我正在尝试从 xml 文件中的 CDATA 节点获取 MethodName 值。
XML 文件看起来像-

<params>
            <param index="0">
              <value>
                <![CDATA[{PackageResponse=./src/test/resources/TestData/ExpectedData/InstantCash/GetAnywherePayoutAgents/ExpectedPackageResponse.json, ProviderRequest=./src/test/resources/TestData/ExpectedData/InstantCash/GetAnywherePayoutAgents/ExpectedProviderRequest.json, ParameterFilePath=./src/test/resources/TestData/RequestParameter/InstantCash/GetAnywherePayoutAgents.json, ProviderResponse=./src/test/resources/TestData/ExpectedData/InstantCash/GetAnywherePayoutAgents/ExpectedProviderResponse.json, MethodName=GetAnywherePayoutAgents}]]>
              </value>
            </param>
          </params>   

我所尝试的只是给我这个的所有文本值-
JAVA 代码-

public static String getCharacterDataFromElement(Element e) {

        NodeList list = e.getChildNodes();
        String data;

        for(int index = 0; index < list.getLength(); index++){
            if(list.item(index) instanceof CharacterData){
                CharacterData child = (CharacterData) list.item(index);
                data = child.getData();

                if(data != null && data.trim().length() > 0)
                    return child.getData();
            }
        }
        return "";
    }  

但我只想要来自 CDATA 的方法名称值。请帮忙!

【问题讨论】:

  • 显而易见的建议是使用标准语法(XML 或 JSON)作为值,而不是你自己编造的东西。但如果您必须使用非标准语法,那么您只需要进行一些自定义解析。
  • 您的整个 getCharacterDataFromElement 方法可以替换为 Element 从 Node 继承的 getTextContent 方法。文本内容本身看起来像未引用的 JSON,因此您应该将其传递给 JSON 解析器,然后检索与 "MethodName" 键对应的值。

标签: java xml xml-parsing cdata


【解决方案1】:

您已经有了检索 CDATA 内容的方法。要从该文本中提取 MethodName 或其他字段,可以实现自定义解析功能,例如:

public static String getMethodName(String source, String fieldName) {
        if(source.startsWith("{") && source.endsWith("}")) {
            source = source.substring(1, source.length() - 1);
        }
        return Arrays.asList(source.split(",")).stream()
                .map(s -> s.trim().split("="))
                .filter(s -> fieldName.equals(s[0]))
                .map(s -> s[1])
                .findFirst()
                .orElse(null);
}

它用逗号分割文本,然后用等号分割每个标记,然后搜索提供的字段名称并在等号后返回文本(如果未找到则返回 null)。可以这样调用:

String cdata = getCharacterDataFromElement(element);
String methodName = getMethodName(cdata , "MethodName");

【讨论】:

  • 感谢@Daniil,它正在工作,但对于 lambda 表达式,我们需要 Java8 或更高版本。
猜你喜欢
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2010-11-19
  • 2011-02-27
相关资源
最近更新 更多