2015-02-26 2 views
1

я разобрать XML документ в Java с:Синтаксический XML с фильтром

doc = DocumentBuilderFactory 
      .newInstance() 
      .newDocumentBuilder() 
      .parse(new URL(url).openStream()); 

работой, но можно разобрать с некоторым фильтром? например, мой XML-файл имеет один приоритет атрибута, можно проанализировать фильтр, например, приоритет> 8?

Таким образом, в документе есть только элемент с приоритетом> 8.

Пример XML:

<url> 
<loc>http</loc> 
<lastmod>2015-02-26</lastmod> 
<title>Hello</titolo> 
<priority>1.0</priority> 
</url> 
... 

Благодарность

+0

После того, как вы создали документ XML, вы можете сгореть XPath, чтобы получить только узлы, которые вы заинтересованы в Если вы размещаете свой формат XML. , возможно, мы сможем помочь вам в этом. –

+0

@RaviThapliyal, но с xpath я должен разобрать и после использования xpath правильно? –

+0

Да, для этого потребуется полное дерево DOM в памяти, в соответствии с которым затем будет вычисленное выражение xpath. –

ответ

1

Для следующего образца входного файла с именем urls.xml

<root> 
    <url> 
     <loc>http</loc> 
     <lastmod>2015-02-26</lastmod> 
     <title>Hello</title> 
     <priority>1.0</priority> 
    </url> 
    <url> 
     <loc>http</loc> 
     <lastmod>2015-02-26</lastmod> 
     <title>Hello</title> 
     <priority>7.0</priority> 
    </url> 
    <url> 
     <loc>http</loc> 
     <lastmod>2015-02-26</lastmod> 
     <title>Hello</title> 
     <priority>10.0</priority> 
    </url> 
</root> 

Сначала создать полное Document дерево, как обычно

Document document = DocumentBuilderFactory 
      .newInstance() 
      .newDocumentBuilder() 
      .parse(new File("urls.xml")); 

Затем запустите XPath запрос, который выбирает все Node сек выше определенные priority

XPathExpression expr = XPathFactory.newInstance() 
         .newXPath().compile("//url[priority > 5]"); 
NodeList urls = (NodeList) expr.evaluate(document, XPathConstants.NODESET); 

Если вы хотите сериализовать результаты в другом XML-файле, сначала создайте новый Document.

Document result = DocumentBuilderFactory.newInstance() 
     .newDocumentBuilder().newDocument(); 
Node root = result.createElement("results"); 
result.appendChild(root); 

Затем добавьте отфильтрованный URL-адрес Node с, как

for (int i = 0; i < urls.getLength(); i++) { 
    Node copy = result.importNode(urls.item(i), true); 
    root.appendChild(result.createTextNode("\n\t")); 
    root.appendChild(copy); 
} 
root.appendChild(result.createTextNode("\n")); 

Теперь все, что вам нужно сделать, это сериализации новый Document к String и пишут, что в файл. Вот я просто распечатаю его на консоли.

System.out.println(
     ((DOMImplementationLS) result.getImplementation()) 
     .createLSSerializer().writeToString(result)); 

Выход:

<?xml version="1.0" encoding="UTF-16"?> 
<results> 
    <url> 
     <loc>http</loc> 
     <lastmod>2015-02-26</lastmod> 
     <title>Hello</title> 
     <priority>7.0</priority> 
    </url> 
    <url> 
     <loc>http</loc> 
     <lastmod>2015-02-26</lastmod> 
     <title>Hello</title> 
     <priority>10.0</priority> 
    </url> 
</results> 
+0

и можно использовать атрибут lastmod в выражении? например, только узел имеет lastmod> 2015-all-all (только 2015) –

+1

Да, конечно. Просто используйте '// url [priority> 8 и start-with (lastmod, '2015 -')]'. –

1

Вы должны использовать XPath, чтобы найти элементы, которые требуют:

XPathFactory xPathfactory = XPathFactory.newInstance(); 
XPath xpath = xPathfactory.newXPath(); 
XPathExpression expr = xpath.compile([your xpath here]); 

Затем ...

NodeList nl = (NodeList) expr.evaluate(doc); 

... для получения требуемых узлов. Вы можете использовать ...

for(Node node in nl) { 
    if (node.getNodeType() == Node.ELEMENT_NODE) { 
    } 
} 

... вытащить только подлинные элементы.

Конечно, вам нужно также создать базовое выражение XPath, чтобы найти нужные вам узлы.

+0

но с xpath я должен разобрать и после использования xpath правильно? –

+0

Нет, сначала вы разбираете документ в «doc» (в соответствии с вашим примером), а затем используете XPath для фильтрации результатов. –

+0

так что невозможно разобрать фильтр? –

Смежные вопросы