Трудно обрабатывать сразу несколько параметров. Лучший способ сделать это - создать класс модели представления. Затем у вас есть один параметр, но параметр содержит несколько свойств данных.
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}".
В то время как вам нужен код для чтения и анализа 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() );
}
}
}
}