2015-10-15 1 views
0

У меня очень простой вопрос для вас, экспертов XML. Я хочу добавить новый элемент рядом с tuple_centre_name, с тем же тегом и другим значением, только если имя пользователя имеет значение, которое я хочу, и другое tuple_centre_name с таким же значением, здесь amministrazione, не существует. Я прошу вас, потому что мне трудно найти этот элемент, проверьте, существует ли еще tuple_centre_name и , затем проверьте родительский атрибут.Добавить элемент XML в дочернем узле, если родительский узел удовлетворяет условию

Я использую DOM в JAVA. Спасибо, что помогли мне.

<?xml version="1.0" encoding="UTF-8" standalone="no"?><accounts> 
    <account> 
     <username>fabio</username> 
     <password>123456</password> 
     <node> 
      <tuple_centre_name>amministrazione</tuple_centre_name> 
      <port>NP</port> 
     </node> 
    </account> 

Пример показан здесь. Запрос: добавьте новое имя tuple_centre_name с именем something else, только если оно еще не существует внутри элемента с именем fabio. Здесь результат я хочу:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><accounts> 
    <account> 
     <username>fabio</username> 
     <password>123456</password> 
     <node> 
      <tuple_centre_name>amministrazione</tuple_centre_name> 
      <tuple_centre_name>Something else</tuple_centre_name> //ok because `fabio` as username is fine for me 
      <port>NP</port>  
     </node> 
    </account> 

ответ

0

Вы хотите XPath для этого:

Document document = /* ... */; 

final String username = "fabio"; 

XPathVariableResolver resolver = new XPathVariableResolver() { 
    @Override 
    public Object resolveVariable(QName varName) { 
     return varName.getLocalPart().equals("user") ? username : null; 
    } 
}; 

Element newElement = document.createElement("tuple_centre_name"); 
newElement.appendChild(document.createTextNode("amministraione")); 

XPath xpath = XPathFactory.newInstance().newXPath(); 
xpath.setXPathVariableResolver(resolver); 

Node tupleCentreNameNode = (Node) xpath.evaluate(
    "//account[username[text()=$user]]/node/tuple_centre_name", 
    document, 
    XPathConstants.NODE); 

tupleCentreNameNode.getParentNode().insertBefore(newElement, 
    tupleCentreNameNode.getNextSibling()); 

XPath обычно выглядит как путь к каталогу, который является, где account/node/tuple_centre_name часть приходит. Две слэши в начале (//account) означают «любой элемент учетной записи, любое количество уровней в глубине документа».

Селектор account[username[text()=$user]] означает элемент учетной записи, который содержит элемент имени пользователя, текст которого соответствует переменной XPath 'user'. " Переменные XPath могут быть определены снаружи с помощью XPathVariableResolver. Хотя в выражении XPath можно жестко закодировать значение имени пользователя, вам нужно будет избежать различных символов, включая кавычки и символы, которые являются особыми в XML; передача имени пользователя в качестве переменной XPath гарантирует, что оно будет правильным.

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