Система сетки Vuetify и Layout: ограничение по вертикали

В то время как вам нужен код для чтения и анализа 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
задан DrHell 19 January 2019 в 21:11
поделиться

1 ответ

Хорошо, после некоторой тряски и еще одного исследования, вот общее решение (которое работает и для нормальных 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>
0
ответ дан DrHell 19 January 2019 в 21:11
поделиться