Как получить дочерний узел с помощью xpath Java

Трудно обрабатывать сразу несколько параметров. Лучший способ сделать это - создать класс модели представления. Затем у вас есть один параметр, но параметр содержит несколько свойств данных.

public class MyParameters
{
    public string a { get; set; } 
    public string b { get; set; }
}

public MyController : ApiController
{
    public HttpResponseMessage Get([FromUri] MyParameters parameters) { ... }
}

Затем вы переходите к:

http://localhost:12345/api/MyController?a=par1&b=par2

Ссылка: http: // www. asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

Если вы хотите использовать «/ par1 / par2 ", вы можете зарегистрировать правило маршрутизации asp. например routeTemplate: «API / {controller} / {action} / {a} / {b}".

См. http://www.asp.net/web-api/overview/ веб-API-маршрутизации-и-действия / маршрутизации-в-ASPnet-веб-API

-1
задан Lynx 13 July 2018 в 08:27
поделиться

1 ответ

В то время как вам нужен код для чтения и анализа XML из некоторого источника и классов для управления и обработки набора данных xml, ответ сводится к следующему выражению XPath:

//Placemark/name[./text()='east am']

Это выражение выбирает ...

  • name элементы, являющиеся ...
  • ... дочерние элементы Placemark элементов ...
  • .. в любом месте документа, ...
  • ... текстовое содержимое элемента name является east am.

Альтернатива

//Placemark/name[string(.)='east am']

См. этот ответ SO для полного обсуждения разницы между string(.) и ./text().

В принципе, с одной стороны, ./text() терпит неудачу, если текстовое содержимое узла xml представлено несколькими текстовыми узлами. AFAIK это решение принимается синтаксическим анализатором, и вы не можете выбрать этот выбор.

С другой стороны, если целевой name узел имеет сложный тип, т.е. могут иметь дочерние элементы со своим текстовым контентом, вам нужно будет указать конкатенацию всех текстовых фрагментов из самого целевого элемента и его потомков.

Код

Этот код является автономным образцом для сбора представления узла, на который ссылается данное выражение xpath из XML-файла, указанного в качестве образца.

Этот код возникает с помощью этого SO-ответа , все кредиты принадлежат его автору, никому.

Обратите внимание, что ваш xml-фрагмент не является допустимым автономным xml-файлом, так как в нем отсутствует один корневой элемент. Добавьте в файл любой синтетический корень, если он еще не имеет одного (выражение xpath будет работать в любом случае).

Имена файлов как есть xpath.java и test.51320827.xml. Протестировано с помощью java 1.8.0_45;

//  https://stackoverflow.com/questions/51320827/how-can-i-retrieve-the-child-node-using-xpath-java
//
//  code taken from:    https://stackoverflow.com/a/47280397
//
//
import java.lang.*;
import java.io.*;
import javax.xml.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.*;

public class xpath {
    public static void main(String[] args) {
        String xpathExpression = "//Placemark/name[./text()='east am']";

        // Read file
        Document doc = null;
        try {

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setValidating(false);
            factory.setNamespaceAware(true);
            factory.setIgnoringComments(true);
            factory.setIgnoringElementContentWhitespace(true);

            DocumentBuilder builder = factory.newDocumentBuilder();
            File file = new File( "test.51320827.xml" );
            FileInputStream stream = new FileInputStream( file );
            doc = builder.parse( stream );
        } catch (SAXException | IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }

        // get from XPath
        try {
            XPathFactory xpf = XPathFactory.newInstance();
            XPath xpath = xpf.newXPath();

            XPathExpression compile = xpath.compile(xpathExpression);
            NodeList nodeList = (NodeList) compile.evaluate(doc, XPathConstants.NODESET);

            displayNodeList(nodeList);
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }

        System.out.println("\n===== ***** =====");
    }

    static void displayNodeList( NodeList nodeList ) {
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            String NodeName = node.getNodeName();

            NodeList childNodes = node.getChildNodes();
            if ( childNodes.getLength() > 1 ) {
                for (int j = 0; j < childNodes.getLength(); j++) {

                    Node child = childNodes.item(j);
                    short nodeType = child.getNodeType();
                    if ( nodeType == 1 ) {
                        System.out.format( "\n\t Node Name:[%s], Text[%s] ", child.getNodeName(), child.getTextContent() );
                    }
                }
            } else {
                System.out.format( "\n Node Name:[%s], Text[%s] ", NodeName, node.getTextContent() );
            }

        }
    }
}
0
ответ дан collapsar 17 August 2018 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: