2013-09-27 4 views
0

Мне нужно сделать 2 вещи.Получить точный xpath из общего xpath

  1. Проверьте значение узла в файле XML.
  2. Если значение соответствует, мне нужно его изменить.

    У меня уже есть сложная иерархия объекта, выполняющего эту работу. Теперь я столкнулся с проблемой. Давайте посмотрим на пример:

    <staticTag> 
        <randomTag> 
        <anotherRandomTag> 
         <staticTag property="id"> 
         <staticTag> VALUE </staticTag> 
         </staticTag> 
        </anotherRandomTag> 
        </randomTag> 
    </staticTag> 
    

Это произойдет п раз в каждом XMLFILE я должен разобрать. Было бы легко с

//staticTag[@property='id']/staticTag/text() 

Да, он вернет мне все значение, которое мне нужно проверить. Проблема в том, что у меня нет точного xpath для изменения значения, если оно соответствует значению, которое я ищу.

При необходимости я могу отправить образец кода. Итак, tl; dr: Есть ли способ генерировать точный xpath из общего? Как обычно, спасибо за ваше время.

Я сделал еще несколько testHere фиктивного XML

<tag> 
    <ZDSJG> 
     <SJROT>X66P1</SJROT> 
    </ZDSJG> 
    <DNLVZ> 
     <SJROT>VV1EZ</SJROT> 
    </DNLVZ> 
</tag> 

Моего Xpath XPression, что я ищу это //SJROT С функцией я написал, я могу генерировать эту XPATH из первого узла: /#document/tag/ZDSJG/SJROT/#text

К сожалению, выражение xpath //SJROT не возвращает мне второй узел, у которого есть это имя. Вот фрагмент кода, который ищет выражения Xpath при условии

XPathExpression expression = xpath.compile(expressionXPath); 

    NodeList result = (NodeList) expression.evaluate(document, XPathConstants.NODE); 

    List<String> generatedXpath = Lists.newArrayList(); 
    for (int i = 0; i < result.getLength(); i++) { 
     generatedXpath.add(getXPath(result.item(i))); 
    } 
    return generatedXpath; 

Другое редактирование: Я установил свой код, я должен был использовать NODESET вместо NODE не будет никаких попыток произвести соответствующую XPATH

+0

Почему бы не использовать '' staticTag [@ property = 'id'] "', без ведущего '/'? - ваш самый верхний тег не будет соответствовать, потому что у него нет этого атрибута. – gaborsch

+0

У меня есть этот узор N раз. В том же файле XML. И мне не нужно менять все эти экземпляры N. Просто, если значение соответствует другому в памяти. – drgn

+0

Я думаю, вам нужно поймать средний '' с атрибутом (я полагаю, нет других узлов с атрибутом 'property =" id "') - можете ли вы это сделать? У нас нет информации о вашем XML. – gaborsch

ответ

0

С Я не нашел ничего, что создало бы XPath из узла. Я сделал свое. Это довольно основательно и может быть улучшено по-разному. Но на данный момент это соответствует моим потребностям. Если у кого-то есть лучшее решение, я с радостью его приму. Вот мой Java-код: не стесняйтесь, чтобы улучшить его

public List<String> generateAbsoluteXpath(File fileToRead, String expressionXPath) throws Exception { 
    DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance(); 
    Document document = documentFactory.newDocumentBuilder().parse(fileToRead); 

    XPathFactory xpathFactory = XPathFactory.newInstance(); 
    XPath xpath = xpathFactory.newXPath(); 

    XPathExpression expression = xpath.compile(expressionXPath); 
    NodeList result = (NodeList) expression.evaluate(document, XPathConstants.NODESET); 

    List<String> generatedXpath = Lists.newArrayList(); 
    for (int i = 0; i < result.getLength(); i++) { 
     generatedXpath.add(getXPath(result.item(i))); 
    } 
    return generatedXpath; 
} 



public String getXPath(Node node) 
{ 
    Node parent = node.getParentNode(); 
    if (parent == null || parent.getNodeName().equals("#document")) { 
     return "/" + node.getNodeName(); 
    } 
    return getXPath(parent) + "/" + node.getNodeName(); 
} 

Так в основном, я вход XPath, который будет генерировать несколько узлов. Он возвращает мне список абсолютных xpath, ссылающихся на узел, который был найден с общим путем. Поскольку у меня есть абсолютный xpath, другой объект, с которым я работаю, теперь может читать/заменять значение. Задача решена.

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