জাভাতে এক্সপ্যাথ ব্যবহার করে কীভাবে এক্সএমএল পড়বেন


273

আমি জাভাতে এক্সপ্যাথ ব্যবহার করে এক্সএমএল ডেটা পড়তে চাই, সুতরাং যে তথ্য সংগ্রহ করেছি তার জন্য আমি আমার প্রয়োজনীয়তা অনুসারে এক্সএমএল বিশ্লেষণ করতে পারছি না।

আমি যা করতে চাই তা এখানে:

এর URL এর মাধ্যমে অনলাইন থেকে এক্সএমএল ফাইল পান, তারপরে পার্স করার জন্য এক্সপথ ব্যবহার করুন, আমি এটিতে দুটি পদ্ধতি তৈরি করতে চাই। একটিতে আমি একটি নির্দিষ্ট নোড অ্যাট্রিবিউট আইডি লিখি এবং ফলস্বরূপ আমি সমস্ত শিশু নোড পাই এবং দ্বিতীয়টি মনে করি আমি কেবল একটি নির্দিষ্ট শিশু নোডের মান পেতে চাই

<?xml version="1.0"?>
<howto>
  <topic name="Java">
      <url>http://www.rgagnonjavahowto.htm</url>
  <car>taxi</car>
  </topic>
  <topic name="PowerBuilder">
       <url>http://www.rgagnon/pbhowto.htm</url>
       <url>http://www.rgagnon/pbhowtonew.htm</url>
  </topic>
  <topic name="Javascript">
        <url>http://www.rgagnon/jshowto.htm</url>
  </topic>
 <topic name="VBScript">
       <url>http://www.rgagnon/vbshowto.htm</url>
 </topic>
 </howto>

উপরের উদাহরণে আমি সমস্ত উপাদান পড়তে চাই যদি আমি @ নামের মাধ্যমে অনুসন্ধান করি এবং এমন একটি ফাংশনও যেখানে আমি কেবল @ নাম 'জাভাস্ক্রিপ্ট' থেকে ইউআরএল চাই কেবল একটি নোড উপাদানই ফিরিয়ে দেব।


1
এই লিঙ্কটি এক্সপথ ব্যবহার করে এক্সএমএল পড়ার সুস্পষ্ট প্রদর্শন করবে
মিঃ চৌডারী

উত্তর:


398

এর লাইন বরাবর আপনার কিছু দরকার:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(<uri_as_string>);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile(<xpath_expression>);

তারপরে আপনি expr.evaluate()সেই কোডটি নির্ধারিত দস্তাবেজটিতে পাসিং এবং আপনি যে প্রত্যাশা করছেন তার রিটার্ন টাইপকে কল করবেন এবং ফলাফলটির অবজেক্টের ধরণে ফলাফলটি নিক্ষেপ করুন।

আপনার যদি কোনও নির্দিষ্ট এক্সপথ এক্সপ্রেশনগুলির সাহায্যের প্রয়োজন হয় তবে আপনার সম্ভবত এটি আলাদা প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত (যদি না এটি প্রথম স্থানে আপনার প্রশ্ন না হত - জাভাতে API কীভাবে ব্যবহার করবেন সে বিষয়ে আমি আপনার প্রশ্নটি বুঝেছিলাম)।

সম্পাদনা: (মন্তব্যের প্রতিক্রিয়া): এই এক্সপথ এক্সপ্রেশনটি আপনাকে পাওয়ারবিল্ডারের অধীনে প্রথম ইউআরএল উপাদানটির পাঠ্য পেতে পারে:

/howto/topic[@name='PowerBuilder']/url/text()

এটি আপনাকে দ্বিতীয়টি পাবে:

/howto/topic[@name='PowerBuilder']/url[2]/text()

আপনি এই কোড সহ এটি পেতে:

expr.evaluate(doc, XPathConstants.STRING);

যদি আপনি না জানেন যে কোনও প্রদত্ত নোডে কতগুলি ইউআরএল রয়েছে, তবে আপনার পরিবর্তে এটি করা উচিত:

XPathExpression expr = xpath.compile("/howto/topic[@name='PowerBuilder']/url");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

এবং তারপরে নোডলিস্টের উপরে লুপ করুন।


1
ধন্যবাদ যিশাই, আমি আমার প্রশ্নটি আরও পরিষ্কার করে দিচ্ছি, যদি আমি পিতামাতার নোডে শিশু নোডগুলি থেকে একটি নির্দিষ্ট মান পেতে চাই। কিভাবে হবে? ধন্যবাদ
কায়বুকি

নাম নির্বিশেষে সমস্ত বিষয় পাওয়া সম্ভব কি? আমি জানতে চাই যে কোনও ওয়াইল্ডকার্ড বা @ নামের জন্য পছন্দগুলি ব্যবহার করা সম্ভব এবং তারপরে নামটিকে একটি আসল মানের সাথে তুলনা করে সমস্ত নোডের মধ্য দিয়ে লুপ করুন
java_geek

1
@ জাভা_জিইক, আপনি এক্সপথটি ব্যবহার করে অতীত হয়ে গেছেন এবং এক্সএমএল পার্সারের মাধ্যমে নোড এবং উপাদান হিসাবে হাঁটা ব্যবহার করা দরকার বলে মনে হচ্ছে, তবে আমি আপনাকে একটি নতুন প্রশ্নে আরও বিস্তৃত করার পরামর্শ দিচ্ছি।
যিশাই

10
আরও কারখানার নির্মাতা কমপোজেটগুলি plz।
সেবাস্তিয়ান গ্রাফ

@ যিশাই এটি এক্সপথের সাথে কাজ করবে না যা নামের স্থানের উপসর্গ রয়েছে।
টিভিশিজির

30

আপনি এটি চেষ্টা করতে পারেন।

এক্সএমএল ডকুমেন্ট

হিসাবে সংরক্ষণ করুন employees.xml

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee id="1">
        <age>29</age>
        <name>Pankaj</name>
        <gender>Male</gender>
        <role>Java Developer</role>
    </Employee>
    <Employee id="2">
        <age>35</age>
        <name>Lisa</name>
        <gender>Female</gender>
        <role>CEO</role>
    </Employee>
    <Employee id="3">
        <age>40</age>
        <name>Tom</name>
        <gender>Male</gender>
        <role>Manager</role>
    </Employee>
    <Employee id="4">
        <age>25</age>
        <name>Meghan</name>
        <gender>Female</gender>
        <role>Manager</role>
    </Employee>
</Employees>

পার্সার ক্লাস

শ্রেণীর নিম্নলিখিত পদ্ধতি রয়েছে

  • তালিকাবদ্ধ
  • একটি পদ্ধতি যা ইনপুট আইডির জন্য কর্মচারীর নাম ফিরিয়ে দেবে।
  • একটি পদ্ধতি যা ইনপুট বয়সের চেয়ে বেশি বয়সের সাথে কর্মচারীদের নামের তালিকা ফিরে আসবে।
  • এমন একটি পদ্ধতি যা মহিলা কর্মচারীদের নামের তালিকা ফিরিয়ে দেবে।

সোর্স কোড

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class Parser {

    public static void main(String[] args) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder;
        Document doc = null;
        try {
            builder = factory.newDocumentBuilder();
            doc = builder.parse("employees.xml");

            // Create XPathFactory object
            XPathFactory xpathFactory = XPathFactory.newInstance();

            // Create XPath object
            XPath xpath = xpathFactory.newXPath();

            String name = getEmployeeNameById(doc, xpath, 4);
            System.out.println("Employee Name with ID 4: " + name);

            List<String> names = getEmployeeNameWithAge(doc, xpath, 30);
            System.out.println("Employees with 'age>30' are:" + Arrays.toString(names.toArray()));

            List<String> femaleEmps = getFemaleEmployeesName(doc, xpath);
            System.out.println("Female Employees names are:" +
                    Arrays.toString(femaleEmps.toArray()));

        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }

    }


    private static List<String> getFemaleEmployeesName(Document doc, XPath xpath) {
        List<String> list = new ArrayList<>();
        try {
            //create XPathExpression object
            XPathExpression expr =
                xpath.compile("/Employees/Employee[gender='Female']/name/text()");
            //evaluate expression result on XML document
            NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
            for (int i = 0; i < nodes.getLength(); i++)
                list.add(nodes.item(i).getNodeValue());
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }
        return list;
    }


    private static List<String> getEmployeeNameWithAge(Document doc, XPath xpath, int age) {
        List<String> list = new ArrayList<>();
        try {
            XPathExpression expr =
                xpath.compile("/Employees/Employee[age>" + age + "]/name/text()");
            NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
            for (int i = 0; i < nodes.getLength(); i++)
                list.add(nodes.item(i).getNodeValue());
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }
        return list;
    }


    private static String getEmployeeNameById(Document doc, XPath xpath, int id) {
        String name = null;
        try {
            XPathExpression expr =
                xpath.compile("/Employees/Employee[@id='" + id + "']/name/text()");
            name = (String) expr.evaluate(doc, XPathConstants.STRING);
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }

        return name;
    }

}

4
+1 তবে আমি আপনার getপদ্ধতিগুলিতে কিছু অতিরিক্ত দেখছি । কেবলমাত্র এক্সপথ স্ট্রিং পরিবর্তন হয় এবং বাকী বেশিরভাগ কোড একই থাকে। সম্ভবত, একটি একক getValuesForXpath () পদ্ধতি যথেষ্ট।
রবি থাপলিয়াল

21

শুরু করার উদাহরণ:

এক্সএমএল ফাইল:

<inventory>
    <book year="2000">
        <title>Snow Crash</title>
        <author>Neal Stephenson</author>
        <publisher>Spectra</publisher>
        <isbn>0553380958</isbn>
        <price>14.95</price>
    </book>

    <book year="2005">
        <title>Burning Tower</title>
        <author>Larry Niven</author>
        <author>Jerry Pournelle</author>
        <publisher>Pocket</publisher>
        <isbn>0743416910</isbn>
        <price>5.99</price>
    </book>

    <book year="1995">
        <title>Zodiac</title>
        <author>Neal Stephenson</author>
        <publisher>Spectra</publisher>
        <isbn>0553573862</isbn>
        <price>7.50</price>
    </book>

    <!-- more books... -->

</inventory>

জাভা কোড:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;


try {

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
    Document doc = docBuilder.parse (new File("c:\\tmp\\my.xml"));

    // normalize text representation
    doc.getDocumentElement().normalize();
    System.out.println ("Root element of the doc is " + doc.getDocumentElement().getNodeName());

    NodeList listOfBooks = doc.getElementsByTagName("book");
    int totalBooks = listOfBooks.getLength();
    System.out.println("Total no of books : " + totalBooks);

    for(int i=0; i<listOfBooks.getLength() ; i++) {

        Node firstBookNode = listOfBooks.item(i);
        if(firstBookNode.getNodeType() == Node.ELEMENT_NODE) {

            Element firstElement = (Element)firstBookNode;                              
            System.out.println("Year :"+firstElement.getAttribute("year"));

            //-------
            NodeList firstNameList = firstElement.getElementsByTagName("title");
            Element firstNameElement = (Element)firstNameList.item(0);

            NodeList textFNList = firstNameElement.getChildNodes();
            System.out.println("title : " + ((Node)textFNList.item(0)).getNodeValue().trim());
        }
    }//end of for loop with s var
} catch (SAXParseException err) {
    System.out.println ("** Parsing error" + ", line " + err.getLineNumber () + ", uri " + err.getSystemId ());
    System.out.println(" " + err.getMessage ());
} catch (SAXException e) {
    Exception x = e.getException ();
    ((x == null) ? e : x).printStackTrace ();
} catch (Throwable t) {
    t.printStackTrace ();
}                


39
এটি প্রশ্নের উত্তর দেয়, তবে এক্সপথ ব্যবহার না করে, যা স্পষ্টভাবে অনুরোধ করা হয়েছে।
অলিভিয়ার গ্রাগোয়ার

এটি প্রয়োজনীয়তার উপর নির্ভর করে। এই উদাহরণটির মতো, যদি নির্দিষ্টটির পরিবর্তে নোডের গোষ্ঠী পেতে প্রয়োজন হয় তবে এই উত্তরটি আরও ভাল।
জিমি

7

এখানে ভিটিডি-এক্সএমএল সহ এক্সপথ প্রক্রিয়াজাতকরণের একটি উদাহরণ দেওয়া হচ্ছে ... ভারী শুল্ক এক্সএমএল প্রসেসিংয়ের জন্য এটি কোনওটির পরে নয়। এখানে জাভা - এ পারফরম্যান্স বেঞ্চমার্ক সহ প্রসেসিং এক্সএমএল সম্পর্কিত এই বিষয়টির সাম্প্রতিক একটি কাগজ এখানে রয়েছে

import com.ximpleware.*;

public class changeAttrVal {
    public  static  void main(String s[]) throws VTDException,java.io.UnsupportedEncodingException,java.io.IOException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false))
            return;
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        XMLModifier xm = new XMLModifier(vn);
        ap.selectXPath("/*/place[@id=\"p14\" and   @initialMarking=\"2\"]/@initialMarking");
        int i=0;
        while((i=ap.evalXPath())!=-1){
            xm.updateToken(i+1, "499");// change initial marking from 2 to 499
        }
        xm.output("new.xml");
    }

}

2

আপনার নীচের মত একটি এক্সএমএল থাকলে

<e:Envelope
    xmlns:d = "http://www.w3.org/2001/XMLSchema"
    xmlns:e = "http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:wn0 = "http://systinet.com/xsd/SchemaTypes/"
    xmlns:i = "http://www.w3.org/2001/XMLSchema-instance">
    <e:Header>
        <Friends>
            <friend>
                <Name>Testabc</Name>
                <Age>12121</Age>
                <Phone>Testpqr</Phone>
            </friend>
        </Friends>
    </e:Header>
    <e:Body>
        <n0:ForAnsiHeaderOperResponse xmlns:n0 = "http://systinet.com/wsdl/com/magicsoftware/ibolt/localhost/ForAnsiHeader/ForAnsiHeaderImpl#ForAnsiHeaderOper?KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzs=">
            <response i:type = "d:string">12--abc--pqr</response>
        </n0:ForAnsiHeaderOperResponse>
    </e:Body>
</e:Envelope>

এবং নীচের এক্সএমএলটি বের করতে চেয়েছিলেন

<e:Header>
   <Friends>
      <friend>
         <Name>Testabc</Name>
         <Age>12121</Age>
         <Phone>Testpqr</Phone>
      </friend>
   </Friends>
</e:Header>

নীচের কোডটি এটি অর্জন করতে সহায়তা করে

public static void main(String[] args) {

    File fXmlFile = new File("C://Users//abhijitb//Desktop//Test.xml");
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    Document document;
    Node result = null;
    try {
        document = dbf.newDocumentBuilder().parse(fXmlFile);
        XPath xPath = XPathFactory.newInstance().newXPath();
        String xpathStr = "//Envelope//Header";
        result = (Node) xPath.evaluate(xpathStr, document, XPathConstants.NODE);
        System.out.println(nodeToString(result));
    } catch (SAXException | IOException | ParserConfigurationException | XPathExpressionException
            | TransformerException e) {
        e.printStackTrace();
    }
}

private static String nodeToString(Node node) throws TransformerException {
    StringWriter buf = new StringWriter();
    Transformer xform = TransformerFactory.newInstance().newTransformer();
    xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    xform.transform(new DOMSource(node), new StreamResult(buf));
    return (buf.toString());
}

এখন আপনি চাইলে নীচের মত xML চাই

<Friends>
   <friend>
      <Name>Testabc</Name>
      <Age>12121</Age>
      <Phone>Testpqr</Phone>
   </friend>
</Friends>

আপনি পরিবর্তন করতে হবে

String xpathStr = "//Envelope//Header"; প্রতি String xpathStr = "//Envelope//Header/*";


1

এটি আপনাকে দেখায় কীভাবে

  1. একটি এক্সএমএল ফাইল এ পড়ুন DOM
  2. একটি সেট আউট ফিল্টার Nodesসঙ্গেXPath
  3. নিষ্কাশিত প্রত্যেকের জন্য একটি নির্দিষ্ট ক্রিয়া সম্পাদন করুন Nodes

আমরা নিম্নলিখিত বিবৃতি সহ কোড কল করব

processFilteredXml(xmlIn, xpathExpr,(node) -> {/*Do something...*/;});

আমাদের ক্ষেত্রে আমরা কিছু মুদ্রণ করতে চান creatorNamesA থেকে book.xmlব্যবহার "//book/creators/creator/creatorName"একটি সম্পাদনের জন্য xPath যেমন printNodeমিল প্রতিটি নোডের জন্য পদক্ষেপ XPath

সম্পূর্ণ কোড

@Test
public void printXml() {
    try (InputStream in = readFile("book.xml")) {
        processFilteredXml(in, "//book/creators/creator/creatorName", (node) -> {
            printNode(node, System.out);
        });
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private InputStream readFile(String yourSampleFile) {
    return Thread.currentThread().getContextClassLoader().getResourceAsStream(yourSampleFile);
}

private void processFilteredXml(InputStream in, String xpath, Consumer<Node> process) {
    Document doc = readXml(in);
    NodeList list = filterNodesByXPath(doc, xpath);
    for (int i = 0; i < list.getLength(); i++) {
        Node node = list.item(i);
        process.accept(node);
    }
}

public Document readXml(InputStream xmlin) {
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        return db.parse(xmlin);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private NodeList filterNodesByXPath(Document doc, String xpathExpr) {
    try {
        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xpath = xPathFactory.newXPath();
        XPathExpression expr = xpath.compile(xpathExpr);
        Object eval = expr.evaluate(doc, XPathConstants.NODESET);
        return (NodeList) eval;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private void printNode(Node node, PrintStream out) {
    try {
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        StreamResult result = new StreamResult(new StringWriter());
        DOMSource source = new DOMSource(node);
        transformer.transform(source, result);
        String xmlString = result.getWriter().toString();
        out.println(xmlString);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

ছাপে

<creatorName>Fosmire, Michael</creatorName>

<creatorName>Wertz, Ruth</creatorName>

<creatorName>Purzer, Senay</creatorName>

জন্য book.xml

<book>
  <creators>
    <creator>
      <creatorName>Fosmire, Michael</creatorName>
      <givenName>Michael</givenName>
      <familyName>Fosmire</familyName>
    </creator>
    <creator>
      <creatorName>Wertz, Ruth</creatorName>
      <givenName>Ruth</givenName>
      <familyName>Wertz</familyName>
    </creator>
    <creator>
      <creatorName>Purzer, Senay</creatorName>
       <givenName>Senay</givenName>
       <familyName>Purzer</familyName>
    </creator>
  </creators>
  <titles>
    <title>Critical Engineering Literacy Test (CELT)</title>
  </titles>
</book>

0

@ ব্লুশ এবং @ যিশাইয়ের দুর্দান্ত উত্তরের সম্প্রসারণ, এখানে আপনি কীভাবে নোডলিস্ট এবং নোড বৈশিষ্ট্যগুলি পুনরাবৃত্তিকে সমর্থন করেন, অর্থাৎ for(Node n: nodelist) ইন্টারফেস।

এটি ব্যবহার করুন:

NodeList nl = ...
for(Node n : XmlUtil.asList(nl))
{...}

এবং

Node n = ...
for(Node attr : XmlUtil.asList(n.getAttributes())
{...}

কোড:

/**
 * Converts NodeList to an iterable construct.
 * From: https://stackoverflow.com/a/19591302/779521
 */
public final class XmlUtil {
    private XmlUtil() {}

    public static List<Node> asList(NodeList n) {
        return n.getLength() == 0 ? Collections.<Node>emptyList() : new NodeListWrapper(n);
    }

    static final class NodeListWrapper extends AbstractList<Node> implements RandomAccess {
        private final NodeList list;

        NodeListWrapper(NodeList l) {
            this.list = l;
        }

        public Node get(int index) {
            return this.list.item(index);
        }

        public int size() {
            return this.list.getLength();
        }
    }

    public static List<Node> asList(NamedNodeMap n) {
        return n.getLength() == 0 ? Collections.<Node>emptyList() : new NodeMapWrapper(n);
    }

    static final class NodeMapWrapper extends AbstractList<Node> implements RandomAccess {
        private final NamedNodeMap list;

        NodeMapWrapper(NamedNodeMap l) {
            this.list = l;
        }

        public Node get(int index) {
            return this.list.item(index);
        }

        public int size() {
            return this.list.getLength();
        }
    }
}

0

এক্সপ্যাথফ্যাক্টরি ব্যবহার করে এক্সএমএল ফাইলটি পড়ুন SAXParserFactory এবংStAX (JSR-173)

এক্সপথ ব্যবহার করে নোড এবং তার শিশু ডেটা পাবেন।

public static void main(String[] args) {
    String xml = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>"
            + "<Yash:Data xmlns:Yash='http://Yash.stackoverflow.com/Services/Yash'>"
            + "<Yash:Tags>Java</Yash:Tags><Yash:Tags>Javascript</Yash:Tags><Yash:Tags>Selenium</Yash:Tags>"
            + "<Yash:Top>javascript</Yash:Top><Yash:User>Yash-777</Yash:User>"
            + "</Yash:Data></soapenv:Body>";
    String jsonNameSpaces = "{'soapenv':'http://schemas.xmlsoap.org/soap/envelope/',"
            + "'Yash':'http://Yash.stackoverflow.com/Services/Yash'}";
    String xpathExpression = "//Yash:Data";

    Document doc1 = getDocument(false, "fileName", xml);
    getNodesFromXpath(doc1, xpathExpression, jsonNameSpaces);
    System.out.println("\n===== ***** =====");
    Document doc2 = getDocument(true, "./books.xml", xml);
    getNodesFromXpath(doc2, "//person", "{}");
}
static Document getDocument( boolean isFileName, String fileName, String xml ) {
    Document doc = null;
    try {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(false);
        factory.setNamespaceAware(true);
        factory.setIgnoringComments(true);
        factory.setIgnoringElementContentWhitespace(true);

        DocumentBuilder builder = factory.newDocumentBuilder();
        if( isFileName ) {
            File file = new File( fileName );
            FileInputStream stream = new FileInputStream( file );
            doc = builder.parse( stream );
        } else {
            doc = builder.parse( string2Source( xml ) );
        }
    } catch (SAXException | IOException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    }
    return doc;
}

/**
 * ELEMENT_NODE[1],ATTRIBUTE_NODE[2],TEXT_NODE[3],CDATA_SECTION_NODE[4],
 * ENTITY_REFERENCE_NODE[5],ENTITY_NODE[6],PROCESSING_INSTRUCTION_NODE[7],
 * COMMENT_NODE[8],DOCUMENT_NODE[9],DOCUMENT_TYPE_NODE[10],DOCUMENT_FRAGMENT_NODE[11],NOTATION_NODE[12]
 */
public static void getNodesFromXpath( Document doc, String xpathExpression, String jsonNameSpaces ) {
    try {
        XPathFactory xpf = XPathFactory.newInstance();
        XPath xpath = xpf.newXPath();

        JSONObject namespaces = getJSONObjectNameSpaces(jsonNameSpaces);
        if ( namespaces.size() > 0 ) {
            NamespaceContextImpl nsContext = new NamespaceContextImpl();

            Iterator<?> key = namespaces.keySet().iterator();
            while (key.hasNext()) { // Apache WebServices Common Utilities
                String pPrefix = key.next().toString();
                String pURI = namespaces.get(pPrefix).toString();
                nsContext.startPrefixMapping(pPrefix, pURI);
            }
            xpath.setNamespaceContext(nsContext );
        }

        XPathExpression compile = xpath.compile(xpathExpression);
        NodeList nodeList = (NodeList) compile.evaluate(doc, XPathConstants.NODESET);
        displayNodeList(nodeList);
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }
}

static void displayNodeList( NodeList nodeList ) {
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        String NodeName = node.getNodeName();

        NodeList childNodes = node.getChildNodes();
        if ( childNodes.getLength() > 1 ) {
            for (int j = 0; j < childNodes.getLength(); j++) {

                Node child = childNodes.item(j);
                short nodeType = child.getNodeType();
                if ( nodeType == 1 ) {
                    System.out.format( "\n\t Node Name:[%s], Text[%s] ", child.getNodeName(), child.getTextContent() );
                }
            }
        } else {
            System.out.format( "\n Node Name:[%s], Text[%s] ", NodeName, node.getTextContent() );
        }

    }
}
static InputSource string2Source( String str ) {
    InputSource inputSource = new InputSource( new StringReader( str ) );
    return inputSource;
}
static JSONObject getJSONObjectNameSpaces( String jsonNameSpaces ) {
    if(jsonNameSpaces.indexOf("'") > -1)    jsonNameSpaces = jsonNameSpaces.replace("'", "\"");
    JSONParser parser = new JSONParser();
    JSONObject namespaces = null;
    try {
        namespaces = (JSONObject) parser.parse(jsonNameSpaces);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return namespaces;
}

এক্সএমএল ডকুমেন্ট

<?xml version="1.0" encoding="UTF-8"?>
<book>
<person>
  <first>Yash</first>
  <last>M</last>
  <age>22</age>
</person>
<person>
  <first>Bill</first>
  <last>Gates</last>
  <age>46</age>
</person>
<person>
  <first>Steve</first>
  <last>Jobs</last>
  <age>40</age>
</person>
</book>

প্রদত্ত এক্সপ্যাথএক্সপ্রেসনের জন্য রেখে দেওয়া:

String xpathExpression = "//person/first";
/*OutPut:
 Node Name:[first], Text[Yash] 
 Node Name:[first], Text[Bill] 
 Node Name:[first], Text[Steve] */

String xpathExpression = "//person";
/*OutPut:
     Node Name:[first], Text[Yash] 
     Node Name:[last], Text[M] 
     Node Name:[age], Text[22] 
     Node Name:[first], Text[Bill] 
     Node Name:[last], Text[Gates] 
     Node Name:[age], Text[46] 
     Node Name:[first], Text[Steve] 
     Node Name:[last], Text[Jobs] 
     Node Name:[age], Text[40] */

String xpathExpression = "//Yash:Data";
/*OutPut:
     Node Name:[Yash:Tags], Text[Java] 
     Node Name:[Yash:Tags], Text[Javascript] 
     Node Name:[Yash:Tags], Text[Selenium] 
     Node Name:[Yash:Top], Text[javascript] 
     Node Name:[Yash:User], Text[Yash-777] */

আমাদের নিজস্ব বাস্তবায়নের জন্য এই লিঙ্কটি দেখুনNamespaceContext

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.