Java XPath - найти теги с префиксом - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующее HTML

<data-my-tag>
  <data-another-tag>
    ... content ... 
  </data-another-tag>
  <data-my-tag>
    ... content ... 
  </data-my-tag>
</data-my-tag>

Теперь мне нужно найти все теги, начинающиеся с префикса <data-. Мне нужно найти их имена, а также их содержание. Я знаю, что это невозможно сделать с помощью регулярных выражений, поэтому я начал работать с javax.xml.parsers. Мне легко найти некоторые теги по определенному имени, но я не могу найти теги, начинающиеся с некоторого префикса.

Какое выражение или код используется для поиска тегов, начинающихся с префикса?

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Вы можете использовать XPath функция запуска с :

public void findElements(InputSource source,
                         String prefix) {

    try {
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList matches = (NodeList) xpath.evaluate(
            "//*[starts-with(local-name(), '" + prefix + "')]",
            source, XPathConstants.NODESET);

        int count = matches.getLength();
        for (int i = 0; i < count; i++) {
            Node match = matches.item(i);
            System.out.println("Element: " + match.getNodeName());
            System.out.println("Text: " + match.getTextContent().trim());
            System.out.println();
        }
    } catch (XPathException e) {
        throw new RuntimeException(e);
    }
}
1 голос
/ 12 марта 2020

Можем ли мы использовать что-то вроде этого:

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class Demo {

    public static void main(String[] args) {

        try {
            File inputFile = new File("input.txt");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputFile);
            doc.getDocumentElement().normalize();
            NodeList nList = doc.getDocumentElement().getChildNodes();

            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE || nNode.getNodeName().startsWith("<data-")) {
                    System.out.println(nNode.getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
...