Как установить пустое значение с помощью XPath? - PullRequest
2 голосов
/ 29 апреля 2010

Используя этот пример XML:

<templateitem itemid="5">
   <templateitemdata>%ARN%</templateitemdata>
</templateitem>
<templateitem itemid="6">
   <templateitemdata></templateitemdata>
</templateitem>

Я использую XPath для получения и установки значений узлов. Код, который я использую для получения узлов:

private static Node ***getNode***(Document doc, String XPathQuery) throws XPathExpressionException
{
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile(XPathQuery);
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    if(nodes != null && nodes.getLength() >0)
        return nodes.item(0);
    throw new XPathExpressionException("No node list found for " + XPathQuery);
}

Чтобы получить значение% ARN%: "// templateitem [@ itemid = 5 ] / templateitemdata / text ()" и с getNode метод Я могу получить узел, а затем вызвать getNodeValue ().

Помимо получения этого значения, я хотел бы установить значение templateitemdata для "templateitem [@ itemid = 6 ]", поскольку оно пустое. Но код, который я использую, не может получить узел, так как он пустой. Результат равен нулю.

Знаете ли вы, как получить узел, чтобы я мог установить значение?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2010

Вы просто запрашиваете сам узел элемента (не его дочерний текстовый узел):

//templateitem[@itemid=6]/templateitemdata

getNodeValue() работает и на элементном узле, использование text() в XPath в обоих случаях совершенно излишне.

0 голосов
/ 29 апреля 2010

Я изменил метод для:

public static Node getNode(Document doc, String XPathQuery) throws XPathExpressionException
{
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile(XPathQuery);
    Object result = expr.evaluate(doc, XPathConstants.NODE);
    Node node = (Node) result;
    if(node != null )
        return node;
    throw new XPathExpressionException("No node list found for " + XPathQuery);
}

Запрос для: // templateitem [@ itemid = 6] / templateitemdata

И метод setValue для:

public static void setValue(final Document doc, final String XPathQuery, final String value) throws XPathExpressionException
{
    Node node = getNode(doc, XPathQuery);
     if(node!= null)
             node.setTextContent(value);
     else
         throw new XPathExpressionException("No node found for " + XPathQuery);
}

Я использую setTextContent () вместо setNodeValue ().

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