Как удалить #text из моего парсинга Node в парсинге Java dom xml - PullRequest
7 голосов
/ 10 января 2011

Итак, у меня есть следующий код, который я в значительной степени скопировал с здесь .Но проблема в том, что мои текстовые узлы не содержат никакого текста, они просто имеют атрибуты.Таким образом, у меня есть

<Random name="Katie" num="5"></Random>

, и я использую этот код для его анализа:

  private void listNodes(Node node, String indent)
  {
    String nodeName = node.getNodeName();
    System.out.println(indent + " Node is: " + nodeName);

    if(node instanceof Element && node.hasAttributes())
    {
      System.out.println(indent + "Attributes are: ");
      NamedNodeMap attrs = node.getAttributes();
      for (int i = 0; i < attrs.getLength(); i++) 
      {
        Attr attribute = (Attr) attrs.item(i);
        System.out.println(indent + attribute.getName() + "=" + attribute.getValue());
      }
    }

    NodeList list = node.getChildNodes(); 

    if (list.getLength() > 0) 
    {
      for (int i = 0; i < list.getLength(); i++)
      {
        listNodes(list.item(i), indent + " "); 
      } 
    }
  }

По некоторым причинам мои пустые текстовые узлы все говорят

Узел: # text

Кто-нибудь знает, как пропустить пустой текст узла при разборе XML-файла?

Спасибо,

Джош

Ответы [ 3 ]

10 голосов
/ 10 января 2011

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

private void listNodes(Node node, String indent)
{
    if (node instanceof Text) {
        String value = node.getNodeValue().trim();
        if (value.equals("") ) {
            return;
        }
    }

    String nodeName = node.getNodeName();
    System.out.println(indent + " Node is: " + nodeName);
    ...
8 голосов
/ 04 декабря 2014

Вы также можете использовать метод Node.getNodeType() для этой цели:

Node node;
if (node.getNodeType() == Node.ELEMENT_NODE) {
   // Your code inside this
}
5 голосов
/ 20 ноября 2013

'# text' является результатом вызова метода getNodeName () на пустом узле. Эти пустые узлы могут быть идентифицированы с помощью 'XPath' и могут быть удалены.

XPathFactory xpathFactory = XPathFactory.newInstance();
// XPath to find empty text nodes.
XPathExpression xpathExp = xpathFactory.newXPath().compile(
    "//text()[normalize-space(.) = '']");  
NodeList emptyTextNodes = (NodeList) 
    xpathExp.evaluate(doc, XPathConstants.NODESET);
// Remove each empty text node from document.
for (int i = 0; i < emptyTextNodes.getLength(); i++) {
  Node emptyTextNode = emptyTextNodes.item(i);
emptyTextNode.getParentNode().removeChild(emptyTextNode);
}

'генерируется # text'в результате пустых мест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...