خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه خواندن و نوشتن فایل های XML با جاوا

محبوبیت XML اخیراً کاهش یافته است، اما ممکن است گاهی اوقات با آن مواجه شوید، بنابراین مهم است که یاد بگیرید چگونه یک فایل XML را بخوانید و بنویسید.

فایل های XML می توانند اهداف مختلفی از جمله ذخیره سازی داده ها را انجام دهند. قبل از اینکه JSON رایج شود، XML قالب ترجیحی برای نمایش، ذخیره و انتقال داده های ساخت یافته بود.

اگرچه محبوبیت XML در سال‌های اخیر کاهش یافته است، ممکن است گاهی اوقات با آن مواجه شوید، بنابراین مهم است که یاد بگیرید چگونه با آن کار کنید. نحوه استفاده از DOM API برای خواندن و نوشتن فایل های XML با جاوا را بیاموزید.

الزامات پردازش XML در جاوا

نسخه استاندارد جاوا (SE) شامل Java API برای پردازش XML (JAXP) است که یک اصطلاح کلی است که بیشتر جنبه های پردازش XML را پوشش می دهد. این شامل:

  • DOM: مدل شیء سند شامل کلاس هایی برای کار با اشیاء XML مانند عناصر، گره ها و ویژگی ها است. DOM API تمام سند XML را برای پردازش در حافظه بارگیری می کند، بنابراین برای فایل های XML بزرگ مناسب نیست.
  • SAX: Simple API برای XML یک API رویداد محور برای خواندن XML است. رویدادها را در پاسخ به محتوای XML که هنگام تجزیه یک فایل پیدا می کند، فعال می کند. ردپای حافظه این روش کم است، اما کار با API دشوارتر از کار با DOM است.
  • StAX: Streaming API برای XML اخیراً اضافه شده است. این فیلتر جریان، پردازش و اصلاح XML را با کارایی بالا ارائه می دهد. در حالی که از بارگیری کل سند XML در حافظه جلوگیری می کند، معماری کششی را به جای معماری رویداد محور ارائه می دهد، بنابراین کدنویسی با آن آسان تر از SAX API است.

برای پردازش XML در جاوا، باید این بسته ها را وارد کنید:

import javax.xml.parsers.*;
import javax.xml.transform.*;
import org.w3c.dom.*;

آماده سازی نمونه فایل XML

نمونه فایل XML از مایکروسافت

برای درک کد نمونه و مفاهیم پشت آن، از این نمونه فایل XML مایکروسافت استفاده کنید. در اینجا گزیده ای آمده است:

<?xml version="1.0"?>
<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>An in-depth look at creating applications
      with XML.</description>
  </book>
  <book id="bk102">
    <author>Ralls, Kim</author>
...snipped...

خواندن فایل XML با DOM API

بیایید به مراحل اساسی مورد نیاز برای خواندن یک فایل XML با استفاده از DOM API نگاه کنیم. با ایجاد یک نمونه از DocumentBuilder که از آن برای تجزیه سند XML استفاده می کنید، شروع کنید:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

اکنون می توانید کل سند را با شروع عنصر ریشه XML در حافظه بارگذاری کنید. در مثال ما، عنصر کاتالوگ است.

// XML file to read
File file = "<path_to_file>";
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

و بس. اکنون به کل سند XML با شروع از عنصر اصلی آن، کاتالوگ، دسترسی دارید.

مطلب مرتبط:   چگونه کد پایتون خود را همزمان با استفاده از Thread ها اجرا کنید

استخراج اطلاعات با استفاده از DOM API

اکنون که عنصر ریشه XML را دارید، می توانید از DOM API برای استخراج اطلاعات جالب استفاده کنید. به عنوان مثال، تمام بچه های کتاب عنصر ریشه را دریافت کنید و روی آنها حلقه بزنید. توجه داشته باشید که getChildNodes() همه فرزندان، از جمله متن، نظرات و غیره را برمی گرداند.

NodeList books = catalog.getChildNodes();

for (int i = 0, ii = 0, n = books.getLength() ; i < n ; i++) {
  Node child = books.item(i);

  if ( child.getNodeType() != Node.ELEMENT_NODE )
    continue;

  Element book = (Element)child;
  // work with the book Element here
}

چگونه یک عنصر فرزند خاص را با توجه به والد پیدا می کنید؟ یک متد استاتیک ایجاد کنید که در صورت یافتن اولین عنصر منطبق یا null را برمی گرداند. این روش شامل دریافت لیستی از گره های فرزند و حلقه زدن از طریق آنها برای انتخاب گره های عنصر با نام مشخص شده است.

static private Node findFirstNamedElement(Node parent,String tagName)
{
  NodeList children = parent.getChildNodes();

  for (int i = 0, in = children.getLength() ; i < in ; i++) {
    Node child = children.item(i);

    if (child.getNodeType() != Node.ELEMENT_NODE)
      continue;

    if (child.getNodeName().equals(tagName))
      return child;
  }

  return null;
}

توجه داشته باشید که DOM API محتوای متنی را در یک عنصر به عنوان یک گره جداگانه از نوع TEXT_NODE در نظر می گیرد. محتوای متن می تواند از چندین گره متنی مجاور تشکیل شده باشد، بنابراین برای واکشی متن یک عنصر به پردازش خاصی نیاز دارید:

static private String getCharacterData(Node parent)
{
  StringBuilder text = new StringBuilder();

  if ( parent == null )
    return text.toString();

  NodeList children = parent.getChildNodes();

  for (int k = 0, kn = children.getLength() ; k < kn ; k++) {
    Node child = children.item(k);

    if (child.getNodeType() != Node.TEXT_NODE)
      break;

    text.append(child.getNodeValue());
  }

  return text.toString();
}

با داشتن این توابع راحت، به این کد نگاهی بیندازید تا برخی از اطلاعات را از نمونه XML فهرست کنید. این اطلاعات دقیق برای هر کتاب موجود در یک کاتالوگ را نشان می دهد:

NodeList books = catalog.getChildNodes();

for (int i = 0, ii = 0, n = books.getLength() ; i < n ; i++) {
  Node child = books.item(i);

  if (child.getNodeType() != Node.ELEMENT_NODE)
    continue;

  Element book = (Element)child;
  ii++;

  String id = book.getAttribute("id");
  String author = getCharacterData(findFirstNamedElement(child, "author"));
  String title = getCharacterData(findFirstNamedElement(child, "title"));
  String genre = getCharacterData(findFirstNamedElement(child, "genre"));
  String price = getCharacterData(findFirstNamedElement(child, "price"));
  String pubdate = getCharacterData(findFirstNamedElement(child, "pubdate"));
  String descr = getCharacterData(findFirstNamedElement(child, "description"));

  System.out.printf("%3d. book id = %s\n" +
    " author: %s\n" +
    " title: %s\n" +
    " genre: %s\n" +
    " price: %s\n" +
    " pubdate: %s\n" +
    " descr: %s\n",
    ii, id, author, title, genre, price, pubdate, descr);
}

در اینجا یک توضیح گام به گام در مورد کد است:

  1. کد از طریق گره های فرزند کاتالوگ، عنصر ریشه، تکرار می شود.
  2. برای هر گره فرزند، که یک کتاب را نشان می دهد، بررسی می کند که آیا نوع گره یک ELEMENT_NODE است یا خیر. اگر نه، آن را به تکرار بعدی ادامه می دهد.
  3. اگر گره فرزند یک ELEMENT_NODE باشد، (Element)child آن را به یک شی Element ارسال می کند.
  4. سپس کد ویژگی‌ها و داده‌های شخصیتی مختلف را از عنصر کتاب استخراج می‌کند، از جمله «id»، «نویسنده»، «عنوان»، «ژانر»، «قیمت»، «تاریخ انتشار» و «توضیح». این داده ها را با استفاده از روش System.out.printf چاپ می کند.
مطلب مرتبط:   نحوه اتصال و استفاده از PostgreSQL در پایتون

در اینجا خروجی به نظر می رسد:

تجزیه XML در کد منبع جاوا و خروجی

نوشتن خروجی XML با استفاده از Transform API

جاوا XML Transform API را برای تبدیل داده های XML فراهم می کند. ما از این API با تبدیل هویت برای تولید خروجی استفاده می کنیم. به عنوان مثال، اجازه دهید یک عنصر کتاب جدید را به کاتالوگ نمونه ارائه شده در بالا اضافه کنیم.

شما ممکن است جزئیات یک کتاب (نویسنده، عنوان، و غیره) را از یک منبع خارجی، مانند فایل خواص یا پایگاه داده، به دست آورید. می توانید از فایل خواص زیر به عنوان مثال استفاده کنید:

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description="It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife." So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

اولین گام این است که فایل XML موجود را با استفاده از روش ارائه شده در بالا تجزیه کنید:

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

اکنون داده ها را از فایل خواص با استفاده از کلاس Properties ارائه شده در جاوا بارگذاری می کنید. کد بسیار ساده است:

String propsFile = "<path_to_file>";
Properties props = new Properties();

try (FileReader in = new FileReader(propsFile)) {
  props.load(in);
}

هنگامی که ویژگی ها را بارگیری کردید، می توانید مقادیری را که می خواهید اضافه کنید از فایل خواص بازیابی کنید:

String id = props.getProperty("id");
String author = props.getProperty("author");
String title = props.getProperty("title");
String genre = props.getProperty("genre");
String price = props.getProperty("price");
String publish_date = props.getProperty("publish_date");
String descr = props.getProperty("description");

اکنون، یک عنصر کتاب خالی ایجاد کنید.

Element book = document.createElement("book");
book.setAttribute("id", id);

افزودن عناصر کودک به کتاب بی اهمیت است. برای راحتی، می توانید نام عناصر مورد نیاز را در یک لیست جمع آوری کنید و مقادیر را در یک حلقه اضافه کنید.

List<String> elnames =Arrays.asList("author", "title", "genre", "price",
  "publish_date", "description");

for (String elname : elnames) {
  Element el = document.createElement(elname);
  Text text = document.createTextNode(props.getProperty(elname));
  el.appendChild(text);
  book.appendChild(el);
}

catalog.appendChild(book);

عنصر کاتالوگ اکنون عنصر کتاب جدید را اضافه کرده است. تنها چیزی که اکنون باقی می ماند نوشتن XML به روز شده است.

مطلب مرتبط:   8 بهترین افزونه Microsoft Edge برای توسعه دهندگان

برای نوشتن XML، به یک نمونه از Transformer نیاز دارید که می توانید آن را به صورت زیر ایجاد کنید:

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, "yes");
tform.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");

می توانید از setOutputProperty() برای درخواست تورفتگی خروجی استفاده کنید.

مرحله آخر اعمال تبدیل است. نتیجه در جریان خروجی، System.out ظاهر می شود.

tform.transform(new DOMSource(document), new StreamResult(System.out));

برای نوشتن خروجی مستقیم روی یک فایل، از موارد زیر استفاده کنید:

tform.transform(new DOMSource(document), new StreamResult(new File("output.xml")));

این تمام مراحلی است که برای خواندن و نوشتن فایل های XML در جاوا نیاز دارید.

اکنون می دانید چگونه فایل های XML را با جاوا بخوانید و بنویسید

تجزیه و دستکاری XML با جاوا یک مهارت ارزشمند است که اغلب در برنامه های دنیای واقعی از آن استفاده می کنید. APIهای DOM و Transform بسیار مفید هستند.

اگر قصد دارید کد سمت مشتری برای برنامه های کاربردی وب یا سایت ها بنویسید، به ویژه درک DOM حیاتی است. رابط DOM جهانی است، بنابراین می‌توانید با استفاده از کدهای مشابه در زبان‌هایی مانند جاوا و جاوا اسکریپت با آن کار کنید.