【问题标题】:How can I do to find in xml with bitwise-and with xpath and java?如何使用按位和使用 xpath 和 java 在 xml 中查找?
【发布时间】:2011-08-31 08:16:30
【问题描述】:

我有这个sample xml

每一行都有一个 id 字段,它的值是位。

我想用按位与运算符在这个文件中查找,但我不知道这是否可行。

我读到了 javascript 中的运算符“&”或 Oracle 中的命令 BITAND,但在 xml o xpath 中没有。

这是java和xpath中的示例代码:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;

import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Util implements java.io.Serializable  {

    static public String filter_xpath_bitand (int var_tipo)

        NodeList nodeList = null;
        Element  element  = null;
        try {
            XPath xpath = XPathFactory.newInstance().newXPath();
            DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();
            DocumentBuilder        builder  = factory.newDocumentBuilder();
            Document            document = builder.parse(new File(fileXML));      
           nodeList = (NodeList)xpath.evaluate("/test/row[(id & \""+ var_tipo +"\") > 1]", document.getDocumentElement(), XPathConstants.NODESET);
        } catch (Exception e) {
            System.out.println("*** filterXML --> exception: " + e.toString());
        }

    }

}

【问题讨论】:

    标签: java xml xpath bitwise-operators bitwise-and


    【解决方案1】:

    从 XPATH 参考来看,没有按位运算之类的东西。

    您可以通过使用现有操作(mod 等)来解决这个问题。

    有关相关问题,请参阅here

    编辑:

    示例 xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <test>
        <row>
            <id>32</id>
            <titulo>yellow</titulo>
        </row>
        <row>
            <id>16</id>
            <titulo>green</titulo>
        </row>
        <row>
            <id>8</id>
            <titulo>red</titulo>
        </row>
        <row>
            <id>1</id>
            <titulo>blue</titulo>
        </row>
        <row>
            <id>2</id>
            <titulo>white</titulo>
        </row>
        <row>
            <id>4</id>
            <titulo>black</titulo>
        </row>
    </test>
    

    Java 代码:

    import java.io.File;
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    
    import javax.xml.xpath.XPathFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    public class BitWiseXPathTest {
    
        public static void main(String[] args) {
    
            Set<String> selectedColors = new HashSet<String>();
            int var_tipo = 33;
            try {
                XPath xpath = XPathFactory.newInstance().newXPath();
                DocumentBuilderFactory factory = DocumentBuilderFactory
                        .newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                String fileXML = "bitwise.xml";
                Document document = builder.parse(new File(fileXML));
    
                String evalStr = "/test/row/id";
                NodeList nodeList = (NodeList)xpath.evaluate(evalStr, document.getDocumentElement(), XPathConstants.NODESET);
    
                for (int i = 0; i < nodeList.getLength(); i++) {
                    Node aNode = nodeList.item(i);
                    if( (Integer.parseInt(aNode.getTextContent()) & var_tipo) > 0) {
                        //System.out.println("color: "+aNode.getNextSibling().getNextSibling().getTextContent());
                        selectedColors.add(aNode.getNextSibling().getNextSibling().getTextContent());
                    }
                }
    
            } catch (Exception e) {
                System.out.println("*** filterXML --> exception: " + e.toString());
            }
    
            System.out.println(selectedColors);
    
        }
    
    }
    

    同样,XPATH 似乎没有按位运算。您可以将操作移到 XPATH 之外并在 Java 中执行它作为一种解决方法。

    【讨论】:

    • 我已经查看了链接,但它没有用处,因为我想在没有 xsl 的情况下找到。
    • 我了解工作原理,但真正的 xml 有 52.000 个项目,每个查询都非常慢。我不相信 xpath 不可能。
    • XPATH 是您唯一的选择吗?这么大的 XML 似乎更适合由 SAX 解析。
    • 也许,但我不知道如何通过 SAX 和 BITAND ¿ 找到?
    • 如果在您的选择范围内,它归结为在 Java 中使用位运算符。只是这么大的 XML 在性能方面由 SAX 比 DOM 处理得更好。
    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多