Внешнее хранение выражений GPath

Я использую groovy для обработки некоторого XML и прочитал следующее руководство http://groovy-lang.org/processing-xml.html. Я понимаю, как заменять узлы, но я хотел бы сохранить эти выражения gpath в файле и прочитать их во время выполнения, чтобы «обнаружить» такие вещи, как URL-адреса, свойства подключения к базе данных и заменить значения/атрибуты узла по мере необходимости.

Кто-нибудь знает возможно ли это?

[править] Пример по запросу

def books = '''
    <response version-api="2.0">
        <value>
            <books>
                <book available="20" id="1">
                    <title>Don Xijote</title>
                    <author id="1">Manuel De Cervantes</author>
                </book>
                <book available="14" id="2">
                    <title>Catcher in the Rye</title>
                   <author id="2">JD Salinger</author>
               </book>
               <book available="13" id="3">
                   <title>Alice in Wonderland</title>
                   <author id="3">Lewis Carroll</author>
               </book>
               <book available="5" id="4">
                   <title>Don Xijote</title>
                   <author id="4">Manuel De Cervantes</author>
               </book>
           </books>
       </value>
    </response>
'''


def response = new XmlParser().parseText(books)

response.value.books.book[0].author.replaceNode{
        author(id:"99s","Harper Lee")
}


// None of the following will work, but hopefully it shows what I'd like to do
// I'd like to store the path expression as a string 
def path = "response.value.books.book[0].author"

// 
path.replaceNode{
    author(getReplacementValueFromSomeLookup(path) )    
}

person K2J    schedule 01.11.2017    source источник
comment
Не могли бы вы показать свой образец ввода и желаемый вывод xml?   -  person Rao    schedule 01.11.2017


Ответы (1)


очень близко к этому вопросу: Как получить ключ из ArrayList, вложенного в JSON, с помощью Groovy и изменить его значение

def books = '''
    <response version-api="2.0">
        <value>
            <books>
                <book available="20" id="1">
                    <title>Don Xijote</title>
                    <author id="1">Manuel De Cervantes</author>
                </book>
                <book available="14" id="2">
                    <title>Catcher in the Rye</title>
                   <author id="2">JD Salinger</author>
               </book>
               <book available="13" id="3">
                   <title>Alice in Wonderland</title>
                   <author id="3">Lewis Carroll</author>
               </book>
               <book available="5" id="4">
                   <title>Don Xijote</title>
                   <author id="4">Manuel De Cervantes</author>
               </book>
           </books>
       </value>
    </response>
'''


def response = new XmlParser().parseText(books)

def path = "ROOT.value.books.book[0].author"

Eval.me('ROOT',response, path).replaceNode{
    author('DEMO')    
}

println groovy.xml.XmlUtil.serialize(response)
person daggett    schedule 01.11.2017
comment
Спасибо за это, кажется, это лучший ответ из того, что я мог видеть. Подход, который я изначально предложил, в конце концов не показался мне правильным, но спасибо за ваш ответ. Что мне действительно нужно, так это SQL для XML/JSON, GPath/XPath кажется немного интенсивным. - person K2J; 02.11.2017