xpath concat () функция с Java - PullRequest
1 голос
/ 28 июня 2011

У меня есть xml, как показано ниже.

<fieldConstraint>
    <fieldBinding>
        <fieldName>instanceId</fieldName>
        <classType>Integer</classType>
        <bindingName>$instanceId</bindingName>
        <genericType>Number</genericType>
    </fieldBinding>
    </fieldConstraint>
        <fieldConstraint>
        <fieldBinding>
        <fieldName></fieldName>
        <classType>String</classType>
        <bindingName>$alertText</bindingName>
        <genericType>String</genericType>
    </fieldBinding>
    <fieldBinding>
        <fieldName>alertText22</fieldName>
        <classType>String22</classType>
        <bindingName>$alertText</bindingName>
        <genericType>String</genericType>
    </fieldBinding>
</fieldConstraint>

Мне нужно получить значение <fieldName> и значение <classType>, разделенные каким-либо специальным символом (#).

forexample: instanceId # Integer (желаемый результат должен выглядеть следующим образом)

Я пытаюсь использовать xpath с использованием Java, как показано ниже. Я не смог получить желаемый вывод.

List importedFields =new ArrayList();
 DocumentBuilderFactory domFactory = 
  DocumentBuilderFactory.newInstance();
  domFactory.setNamespaceAware(true); 
  DocumentBuilder builder = domFactory.newDocumentBuilder();
  Document doc = builder.parse("abc.xml");
  XPath xpath = XPathFactory.newInstance().newXPath();
  NamespaceContext context = new NamespaceContextMap(
            "foo", "http://www.cisco.com/BRL");
  xpath.setNamespaceContext(context);
  XPathExpression expr = xpath.compile("concat(//foo:fieldConstraint/foo:fieldBinding/foo:fieldName/text(),//foo:fieldConstraint/foo:fieldBinding/foo:classType/text())");
  Object result = expr.evaluate(doc, XPathConstants.NODESET);
  NodeList nodes = (NodeList) result;
  for (int i = 0; i < nodes.getLength(); i++) {
      Node currentItem = nodes.item(i);
      String value = currentItem.getTextContent();
      importedFields.add(value);

      System.out.println("FIELD ARRAY list IS:"+importedFields);

Я получаю следующее исключение.

Ваша помощь приветствуется.

Exception in thread "main" 
com.sun.org.apache.xpath.internal.XPathException: Can not convert #STRING to a NodeList!
    at com.sun.org.apache.xpath.internal.objects.XObject.error(Unknown Source)
    at com.sun.org.apache.xpath.internal.objects.XObject.nodelist(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.getResultAsType(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(Unknown Source)
    at com.cisco.sample.Xpath.main(Xpath.java:47)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(Unknown Source)
    at com.cisco.sample.Xpath.main(Xpath.java:47)
Caused by: com.sun.org.apache.xpath.internal.XPathException: Can not convert #STRING to a NodeList!
    at com.sun.org.apache.xpath.internal.objects.XObject.error(Unknown Source)
    at com.sun.org.apache.xpath.internal.objects.XObject.nodelist(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.getResultAsType(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source)
    ... 2 more

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Функция concat возвращает строку, но используемая вами оценка xpath пытается вернуть NodeList.

Try:

Object result = expr.evaluate(doc, XPathConstants.STRING);
String s = (String)result;

UPDATE

Toполучить все элементы, которые вы можете сделать следующим образом:

NodeList nodeList = doc.getElementsByTagName("fieldBinding");
for (int i = 0; i < nodeList.getLength(); i++) {
  Node node = nodeList.item(i);
  if (node.getNodeType() == Node.ELEMENT_NODE) {
    Element element = (Element) node;
    Node fieldNameNode = element.getElementsByTagName("fieldName").item(0);
    String fieldName = fieldNameNode.getNodeValue();
    Node classTypeNode = element.getElementsByTagName("classType").item(0);
    String classType = classTypeNode.getNodeValue();
  }
}
1 голос
/ 23 декабря 2011

Измените следующую строку на XPathConstants.STRING, поскольку вы получаете строку, а не список узлов

Object result = expr.evaluate(doc, XPathConstants.STRING);

и для XPATH

XPathExpression expr = xpath.compile("concat(//foo:fieldConstraint/foo:fieldBinding/foo:fieldName/text(),'#', //foo:fieldConstraint/foo:fieldBinding/foo:classType/text())");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...