В то время как вам нужен код для чтения и анализа 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() );
}
}
}
}
Хорошо, после некоторой тряски и еще одного исследования, вот общее решение (которое работает и для нормальных div'ов).
Div, содержащий текст (v-card-text, в приведенном выше примере) должен иметь «position: absolute;», родительский div (v-card, в приведенном выше примере) должен иметь «position: относительный; переполнение -y: auto; "
Это решение, как сказано выше, работает вполне обычно, даже если в некоторых случаях (например, когда все находится в V-вкладках), оно все равно не работает, по причине, все еще не ясной.
Вот кодовая ручка с макетом, работающим так, как задумано. https://codepen.io/anon/pen/gZVqBE?editors=1010
Это интересующие строки:
...
<v-card color="orange lighten-2;" style=" position: relative; overflow-y: auto;" tile flat>
<v-card-text style="position: absolute">{{ lorem.slice(0, 90) }} {{lorem}} {{lorem}} {{lorem}} {{lorem}} {{lorem}}</v-card-text>
...
И это весь код в авторучке
<div id="app">
<v-app id="inspire">
<v-container fluid grid-list-sm d-flex style="height:100%">
<v-layout row wrap>
<v-flex d-flex xs12 order-xs5>
<v-layout column>
<v-flex d-flex>
<v-card color="blue-grey" dark tile flat>
<v-card-text>{{ lorem }}</v-card-text>
</v-card>
</v-flex>
<v-flex d-flex>
<v-card color="brown" dark tile flat>
<v-card-text>{{ lorem }}</v-card-text>
</v-card>
</v-flex>
</v-layout>
</v-flex>
<v-flex d-flex xs12 sm7>
<v-layout row wrap>
<v-flex d-flex>
<v-card color="indigo lighten-2" dark tile flat>
<v-card-text>{{ lorem.slice(0, 70) }}</v-card-text>
</v-card>
</v-flex>
<v-flex d-flex>
<v-layout row>
<v-flex
v-for="n in 2"
:key="n"
d-flex
>
<v-card
color="amber lighten-2"
tile
flat
>
<v-card-text>{{ lorem.slice(0, 40) }}</v-card-text>
</v-card>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
</v-flex>
<v-flex d-flex xs12 sm2 child-flex>
<v-card color="orange lighten-2;" style=" position: relative; overflow-y: auto;" tile flat>
<v-card-text style="position: absolute">{{ lorem.slice(0, 90) }} {{lorem}} {{lorem}} {{lorem}} {{lorem}} {{lorem}}</v-card-text>
</v-card>
</v-flex>
<v-flex d-flex xs12 sm3>
<v-card color="red lighten-2" dark tile flat>
<v-card-text>{{ lorem.slice(0, 100) }}</v-card-text>
</v-card>
</v-flex>
</v-layout>
</v-container>
</v-app>
</div>