Как получить результат логического выражения XPath (например, «ложь»)?

Я хотел бы, чтобы Java генерировала «0», если выражение XPath оценивается как «ложное».

У меня есть этот Java-код:

//Read the input XML document
private SAXBuilder parser = new SAXBuilder();
    private Document characters;
    private XPath pProbs;
    private List<Attribute> probs;
    private Double[] dprobs;
    private String pathToSourceXml;
    private String content1, content2, content3, content4, content5;

    characters = parser.build(pathToSourceXml);
    pProbs = XPath.newInstance("/n-grams-sorted/n-gram[contains(.,"+content1+") or contains(.,"+content2+") or contains(.,"+content3+") or contains(.,"+content4+") or contains(.,"+content5+")]/@probability");
    probs = (List<Attribute>) pProbs.selectNodes(characters);
    ...

//Return all the values of the @probability attibrutes
public Double[] getProbs(String pathToSourceXml) {
    this.pathToSourceXml = pathToSourceXml;

    List<Double> theDoubles = new ArrayList();
    dprobs = new Double[5];
    for (int i=0; i<probs.size(); i++) {
        theDoubles.add(Double.parseDouble(probs.get(i).getValue()));
        dprobs[i] = theDoubles.get(i);
    }
    return dprobs;
}

Проблема здесь в том, что этот код:

pProbs = XPath.newInstance("/n-grams-sorted/n-gram[contains(.,"+content1+") or contains(.,"+content2+") or contains(.,"+content3+") or contains(.,"+content4+") or contains(.,"+content5+")]/@probability");

возвращает только 4 элемента, потому что 'content1' возвращает 'false'. Нет узлов n-граммы, содержимое которых содержит строку '$$$'. Однако остальные узлы содержимого оцениваются как «истина».

Если одно из этих выражений contains() оценивается как «ложь», я должен нарисовать «0» в своем коде Xaml. На экране должен появиться «0», например:

'# # #' = 0.0015
'? ? ?' = 0.0047
'k i d' = 0.0012
'$ $ $' = 0

Я не могу получить этот «0». Я не знаю, как сказать: «вернуть ноль, если нет узлов, содержащих '$ $ $' в качестве содержимого.

Есть идеи, как это сделать?

Спасибо.


person MrStack    schedule 17.08.2011    source источник
comment
Почему XPath должен возвращать 0, если вы можете создать его с помощью Java? XPath может выбирать только из того, что есть на самом деле.   -  person Tomalak    schedule 17.08.2011
comment
В любом случае, я пытаюсь получить 0, если один из элементов не содержит определенной строки «x y z».   -  person MrStack    schedule 17.08.2011
comment
Вы не будете. XPath — это язык выбора, и нет никакой гарантии, что вы сможете выбрать то, что просите. Пусть 5 выражений запускаются в цикле и присваивают результаты (или 0) массиву по отдельности.   -  person Tomalak    schedule 18.08.2011


Ответы (2)


Вот ответ:

public class XPathCharacters {
    private SAXBuilder parser = new SAXBuilder();
    private Document characters;
    private XPath pProbs, pContent1, pContent2, pContent3, pContent4, pContent5;
    private List<Attribute> probs1, probs2, probs3, probs4, probs5;
    private List<List<Attribute>> probs;
    private List<String> noNodes;
    private Double[] dprobs;
    private String pathToSourceXml;
    private String content1, content2, content3, content4, content5;
    private int noNode;

    public XPathCharacters(){

    }

    public XPathCharacters(String path, String content1,String content2,String content3,String content4,String content5){
        setPathToSourceXml(path);
        this.content1 = content1;
        this.content2 = content2;
        this.content3 = content3;
        this.content4 = content4;
        this.content5 = content5;
        noNode = 0;
        initiate();
    }

    public void initiate() {
        try {
        //Evaluate each XPath expression seperately 
            characters = parser.build(pathToSourceXml);
            pContent1 = XPath.newInstance("/n-grams-sorted/n-gram[contains(.,"+content1+")]/@probability");
            pContent2 = XPath.newInstance("/n-grams-sorted/n-gram[contains(.,"+content2+")]/@probability");
            pContent3 = XPath.newInstance("/n-grams-sorted/n-gram[contains(.,"+content3+")]/@probability");
            pContent4 = XPath.newInstance("/n-grams-sorted/n-gram[contains(.,"+content4+")]/@probability");
            pContent5 = XPath.newInstance("/n-grams-sorted/n-gram[contains(.,"+content5+")]/@probability");

            //Convert the result of the above XPath expressions to nodes
            probs1 = (List<Attribute>) pContent1.selectNodes(characters);
            probs2 = (List<Attribute>) pContent2.selectNodes(characters);
            probs3 = (List<Attribute>) pContent3.selectNodes(characters);
            probs4 = (List<Attribute>) pContent4.selectNodes(characters);
            probs5 = (List<Attribute>) pContent5.selectNodes(characters);

        } catch (JDOMException jdome) {
            System.out.println("Error at XPathInformationgain.initiate(): JDOMException: " + jdome.getMessage());
        } catch (IOException ioe) {
            System.out.println("Error at XPathInformationgain.initiate(): IOException: " + ioe.getMessage());
        }
    }

    private void setPathToSourceXml(String path) {
        this.pathToSourceXml = path;
    }

    public Double[] getProbs(String pathToSourceXml) {
        this.pathToSourceXml = pathToSourceXml;

        probs = new ArrayList();
        probs.add(probs1);
        probs.add(probs2);
        probs.add(probs3);
        probs.add(probs4);
        probs.add(probs5);

        List<Double> theDoubles = new ArrayList();
        dprobs = new Double[5];
        noNodes = new ArrayList();
        int j=0;
        for (int i=0; i<5; i++) {
            if (probs.get(i).size() > 0) {
                System.out.println("i: "+i);
                System.out.println("j: "+j);
               //Add the value of all these nodes to an Array so you can work with them
               theDoubles.add(Double.parseDouble(probs.get(i).get(0).getValue()));
                dprobs[j] = theDoubles.get(j);
            }
            else {
                //If one of the values happens to be a zero-length array, add 0.0 to the array of values
                theDoubles.add(0.0);
            }
        }
        return dprobs;
    }

    public List<String> getNoNodes() {
        return noNodes;
    }
}

(Этот код не работает для того, что я хочу выполнить за пределами этого вопроса, но он работает для этого вопроса, потому что у меня есть способ вернуть «0» в java, когда выражение XPath дает нулевую длину).

Решение этой части действительно:

        else {
            theDoubles.add(0.0);
        }
person MrStack    schedule 18.08.2011

Я хотел бы, чтобы Java генерировала «0», если выражение XPath оценивается как «ложное».

Это выражение XPath:

number(boolean(yourExpression))

оценивается как 0 ровно тогда, когда boolean(yourExpression) равно false().

Вам нужно просто заменить yourExpression выше своим выражением (что совсем не ясно из вопроса) и оценить это выражение XPath с доступными вам классами/методами, связанными с XPath.

person Dimitre Novatchev    schedule 19.08.2011