Как использовать переменную в root.findall ('* / node [@ color = & ldquo; keyword & rdquo;]' из XML-API ElementTree [дубликат]

Тип математики с плавающей запятой, которая может быть реализована на цифровом компьютере, обязательно использует приближение реальных чисел и операций над ними. (Стандартная версия стандартная работает до более чем пятидесяти страниц документации и имеет комитет для рассмотрения ее ошибок и дальнейшего уточнения.)

Это приближение представляет собой смесь приближений разного типа, каждый из которых можно либо игнорировать, либо тщательно учитывать из-за его конкретного способа отклонения от точности. Это также включает в себя ряд явных исключительных случаев как на уровне аппаратного обеспечения, так и на уровне программного обеспечения, которое большинство людей прогуливает прямо мимо, делая вид, что не замечает.

Если вам нужна бесконечная точность (например, вместо числа π одного из его более коротких резервных копий), вы должны написать или использовать символическую математическую программу.

Но если вы в порядке с идеей о том, что иногда математика с плавающей запятой нечеткая по значению и логике и ошибки могут быстро накапливаться, и вы можете написать свои требования и тесты для этого, тогда ваш код может часто проходить с помощью того, что находится в вашем FPU.

2
задан kjhughes 28 April 2016 в 16:39
поделиться

2 ответа

Учитывая, что вы используете библиотеку Axiom XPath, которая, в свою очередь, использует Jaxen, вам нужно будет выполнить следующие три шага, чтобы сделать это в полной мере:

  • Создать a SimpleVariableContext и вызвать context.setVariableValue("val", "value1"), чтобы присвоить значение этой переменной.
  • На вашем объекте BaseXPath вызовите .setVariableContext(), чтобы передать в контекст, который вы назначили.
  • Внутри вашего выражения используйте /a/b/c[x=$val]/y для ссылки на это значение.

Рассмотрим следующее:

package com.example;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.common.AxiomText;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.axiom.om.xpath.DocumentNavigator;
import org.jaxen.*;

import javax.xml.stream.XMLStreamException;

public class Main {

    public static void main(String[] args) throws XMLStreamException, JaxenException {
        String xmlPayload="<parent><a><b><c><x>val1</x><y>abc</y></c>" +
                                        "<c><x>val2</x><y>abcd</y></c>" +
                          "</b></a></parent>";
        OMElement xmlOMOBject = AXIOMUtil.stringToOM(xmlPayload);

        SimpleVariableContext svc = new SimpleVariableContext();
        svc.setVariableValue("val", "val2");

        String xpartString = "//c[x=$val]/y/text()";
        BaseXPath contextpath = new BaseXPath(xpartString, new DocumentNavigator());
        contextpath.setVariableContext(svc);
        AxiomText selectedNode = (AxiomText) contextpath.selectSingleNode(xmlOMOBject);
        System.out.println(selectedNode.getText());
    }
}

... который испускает выход:

abcd
4
ответ дан Charles Duffy 25 August 2018 в 22:32
поделиться

Это зависит от языка, на котором вы используете XPath.

В XSLT:

 "//a/b/c[x=$myParamForXAttribute]"

Обратите внимание, что в отличие от вышеприведенного подхода три ниже открыты для инъекций XPath-инъекций и никогда не должны использоваться с неконтролируемыми или ненадежными входами; чтобы избежать этого, используйте механизм, предоставляемый вашим языком или библиотекой, чтобы передавать переменные вне диапазона. [Кредит: Чарльз Даффи]

В C #:

String.Format("//a/b/c[x={0}]", myParamForXAttribute);

В Java:

String.format("//a/b/c[x=%s]", myParamForXAttribute);

В Python:

 "//a/b/c[x={}]".format(myParamForXAttribute)
4
ответ дан kjhughes 25 August 2018 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: