Friday, October 8, 2010

Java application XPath ( xml document ) expression example

Expression Meaning
XXX XXX нэртэй бүх тагуудыг ялган авна
* Бүх тагуудыг болон элементийг авна.
../TITLE Эцэг элементийн TITLE тагийг авна.
XXX[@AAA] XXX тагууд дотроос attribute нь AAA гэсэн нэртэй байх тагуудыг авна.
*[last()] Сонгосон элементийн сүүлчийн хүү элементийг авна.
*/ZZZ ZZZ элементүүдийн хамгийн дээд талд байгааг сонгон авна.
XXX[ZZZ] XXX элемент нь ZZZ гэсэн хүү элементтэй бол авна.
XXX[@WIDTH and not(@WIDTH="20")] XXX элемент нь WIDTH гэсэн attribute -тай ба утга нь "20" -с ялгаатай бол авна.
/* document -ийн хамгийн захын ( гадна талд байгаа ) элементийг авна.
//TITLE document -ийн TITLE нэртэй тагуудыг авна.
./@* Сонгосон элементийн ( current element ) бүх attributes -г авна.

Өгүүлбэрийн төгсгөлд "авна" гэж бичсэн байгаа нь утга буцаана гэсэн утгыг илэрхийлнэ.
Доорхи жишээг харна уу!

Ямар нэгэн XML файл:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<XDataTable name="Table1" rowcount="1">
<Columns>
<XDataColumn name="id" size="9" type="Long"/>
<XDataColumn name="name" size="150" type="String"/>
<XDataColumn name="image" size="4" type="ByteArray"/>
</Columns>
<Rows>
<XDataRow index="0"><id>1</id><name>b.boldbaatar</name><image>df56382d63412d</image></XDataRow>
</Rows>
</XDataTable>

Хандаж ажиллаж байгаа жишээ class элдэв функыг нь хасаад:

тод хараар тэмдэглэсэн хэсгийг сайн ажиглаарай.
мэдээж энэхүү классыг ашиглахын өмнө Document үүсгэн XML -г
унших ёстой.


package xdata;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import xdata.Interface.IDataColumn;
import xdata.Interface.IDataRow;
import xdata.Interface.IDataTable;
import AIObjectManager.AIXMLBuilder; // Xml -тэй ажилладаг зарим код
import java.io.Serializable;
import java.util.ArrayList;
import javax.xml.xpath.XPathConstants;
import org.w3c.dom.*;
import org.w3c.dom.Element;

/**
 *
 * @author boroo
 */
public class XDataTable implements IDataTable, Serializable {

    private Document xdoc;
    private ActionListener tranEvent;

    public XDataTable() {
        //xdoc = new com.sun.org.apache.xerces.internal.dom.DocumentImpl();
        this("");
    }

    public XDataTable(Document doc) {
        this.xdoc = doc;
    }

    public void addColumn(IDataColumn column) {

        String exp = "//XDataColumn[@name='" + column.getName() + "']@name";
        if(XdbEngine.get(this.xdoc.getOwnerDocument(), exp, XPathConstants.NODE) != null) {
            throw new RuntimeException("Column name is already exists in table !");
        }

        NodeList nodes = this.xdoc.getElementsByTagName("Columns");
        Node node = nodes.item(0);

        Element newCol = this.xdoc.createElement("XDataColumn");
        newCol.setAttribute("name", column.getName());
        newCol.setAttribute("type", column.getType().name());
        newCol.setAttribute("auto", "" + column.getAuto());
        newCol.setAttribute("empty", "" + column.getEmpty());

        node.appendChild(newCol);
    }

    public List<IDataRow> getRows() {
        //String exp = "/XDataTable/Rows/node()";
        //NodeList rows = (NodeList) XdbEngine.get(this.xdoc, exp, XPathConstants.NODESET);
        NodeList rows = this.xdoc.getElementsByTagName("XDataRow");

        int l = rows.getLength();
        ArrayList<IDataRow> list = new ArrayList<IDataRow>();

        for (int i = 0; i < l; i++) {
            Element item = (Element) rows.item(i);
            XDataRow row = new XDataRow();
            row.FillFrom(item);
            list.add(row);
        }
        return list;
    }

    public int getRowCount() {
        String exp = "//XDataTable[@rowcount]/@rowcount";
        Node curr = (Node) XdbEngine.get(this.xdoc, exp, XPathConstants.NODE);

        return Integer.parseInt(curr.getNodeValue());
    }

    private void setRowCount(int rowcount) {
        String exp = "//XDataTable[@rowcount]/@rowcount";
        Node curr = (Node) XdbEngine.get(this.xdoc, exp, XPathConstants.NODE);

        curr.setNodeValue("" + rowcount);
    }

    public void Commit() {
        String exp = "//XDataRow[@handle != '1']/@handle";
        NodeList curr = (NodeList) XdbEngine.get(this.xdoc, exp, XPathConstants.NODESET);

        for(int i = 0; i < curr.getLength(); i++){
            Node nod = curr.item(i);
            nod.setNodeValue("1");
        }
        if(this.tranEvent != null)
            this.tranEvent.actionPerformed(
                    new ActionEvent(this, 0, "Commit"));
    }


    public void setDocument(Document doc) {
        this.xdoc = doc;
    }

    public Document getDocument() {
        return this.xdoc;
    }
}

No comments: