<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>MPP on File Format Blog</title>
    <link>https://blog.fileformat.com/fa/tag/mpp/</link>
    <description>Recent content in MPP on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>fa</language><atom:link href="https://blog.fileformat.com/fa/tag/mpp/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>بهترین APIهای منبع باز برای تجزیه فایل‌های MS Project MPP و Primavera XER</title>
      <link>https://blog.fileformat.com/fa/project-management/top-open-source-apis-for-handling-ms-project-mpp-&amp;-primavera-XER-files/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/fa/project-management/top-open-source-apis-for-handling-ms-project-mpp-&amp;-primavera-XER-files/</guid>
      <description>به دنبال ابزارهای منبع باز برای خواندن برنامه‌ریزی‌های Microsoft Project MPP و Primavera XER هستید؟ کتابخانه‌های برتری مانند MPXJ و xerparser برای Java، Python و .NET را کشف کنید.</description>
      <content:encoded><![CDATA[<p><strong>آخرین به‌روزرسانی</strong>: 02 سپتامبر 2026</p>
<figure class="align-center ">
    <img loading="lazy" src="images/top-open-source-apis-for-handling-ms-project-mpp-&amp;-primavera-XER-files.jpg#center"
         alt="Best Open Source APIs for Parsing MS Project MPP &amp; Primavera XER Files"/> 
</figure>

<h2 id="برترین-apiهای-منبع-باز-برای-کار-با-فایلهای-ms-project-mpp7-و-primavera-xer9">برترین APIهای منبع باز برای کار با فایل‌های MS Project (<a href="https://wiki.fileformat.com/project-management/mpp/">MPP</a>) و Primavera (<a href="https://docs.fileformat.com/project-management/xer/">XER</a>)</h2>
<p>در مدیریت پروژه‌های سازمانی، دو فرمت فایل اختصاصی برتر هستند: <strong>Microsoft Project (<code>.mpp</code>)</strong> و <strong>Oracle Primavera P6 (<code>.xer</code>)</strong>. چه در حال ساخت داشبورد تحلیلی داخلی باشید، زمان‌بندی‌های ساخت و ساز را با سیستم‌های ERP همگام‌سازی کنید، یا خطوط لوله وضعیت پروژه را خودکار کنید، خواندن و دستکاری این فایل‌های زمان‌بندی به‌صورت برنامه‌نویسی یک نیاز حیاتی است.</p>
<p>با این حال، هر دو قالب موانع مهندسی مشهور را به وجود می‌آورند:</p>
<ul>
<li><strong>فایل‌های MPP</strong> باینری، ذخیره‌سازی ساختاری OLE بدون مستندات یا قالب‌های سند ترکیبی مالکیتی هستند که با تغییرات طرح‌واره در تقریباً هر نسخه اصلی MS Project (2000، 2003، 2007، 2010، 2013، 2016، 2019، 2021) همراه‌اند.</li>
<li><strong>فایل‌های Primavera XER</strong> خروجی‌های متنی با جداسازی با تب هستند که به صورت جداول پایگاه‌داده رابطه‌ای ساختار یافته‌اند (<code>%T</code> جداول با فیلدهای <code>%F</code> و رکوردهای <code>%R</code>)، پر از محدودیت‌های پیچیده یکپارچگی ارجاعی، ارث‌بری چندتقویمی، و منطق مسیر بحرانی.</li>
</ul>
<p>SDKهای تجاری مانند Aspose.Tasks وجود دارند، اما هزینه‌های مجوز و قفل‌گذاری فروشنده، جایگزین‌های منبع باز قوی را ضروری می‌سازند. در این راهنما، ما برترین APIها، کتابخانه‌ها و تجزیه‌کننده‌های منبع باز موجود برای Java، Python و C# را برای پردازش تمیز و کارآمد فایل‌های MPP و XER بررسی می‌کنیم.</p>
<h2 id="مقایسه-سریع-ابزارهای-منبع-باز">مقایسه سریع ابزارهای منبع باز</h2>
<table>
<thead>
<tr>
<th style="text-align:left">کتابخانه / ابزار</th>
<th style="text-align:left">زبان اصلی</th>
<th style="text-align:left">قالب‌های پشتیبانی‌شده</th>
<th style="text-align:left">خواندن / نوشتن</th>
<th style="text-align:left">بهترین مورد استفاده</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>MPXJ</strong></td>
<td style="text-align:left">جاوا (پایتون / .NET bindings)</td>
<td style="text-align:left"><a href="https://wiki.fileformat.com/project-management/mpp/">MPP</a>, <a href="https://docs.fileformat.com/project-management/mpt/">MPT</a>, <a href="https://docs.fileformat.com/project-management/mpx/">MPX</a>, <a href="https://docs.fileformat.com/project-management/xer/">XER</a>, PMXML, MSPDI</td>
<td style="text-align:left">خواندن (MPP/XER)؛ نوشتن (MPX/MSPDI/PMXML)</td>
<td style="text-align:left">جاوا سازمانی، تبدیل چند فرمت، برنامه‌ریزی همه‌جانبه</td>
</tr>
<tr>
<td style="text-align:left"><strong>xerparser</strong></td>
<td style="text-align:left">Python</td>
<td style="text-align:left">XER</td>
<td style="text-align:left">خواندن و تجزیه</td>
<td style="text-align:left">علم داده، تجزیه و تحلیل زمان‌بندی pandas، خطوط لوله ETL</td>
</tr>
<tr>
<td style="text-align:left"><strong>python-mpxj</strong></td>
<td style="text-align:left">پایتون</td>
<td style="text-align:left">MPP, XER, XML</td>
<td style="text-align:left">خواندن / تبدیل</td>
<td style="text-align:left">wrapper پایتونی برای MPXJ با استفاده از JPype</td>
</tr>
<tr>
<td style="text-align:left"><strong>netezza-xer / xer-to-csv</strong></td>
<td style="text-align:left">Shell / Python / Go</td>
<td style="text-align:left">XER</td>
<td style="text-align:left">جریان / استخراج</td>
<td style="text-align:left">استخراج جداول خام شبیه SQL به پایگاه‌های داده رابطه‌ای</td>
</tr>
<tr>
<td style="text-align:left"><strong>OpenProj / ProjectLibre Core</strong></td>
<td style="text-align:left">Java</td>
<td style="text-align:left">MPP (نسخه‌های قدیمی)، XML</td>
<td style="text-align:left">خواندن / رندر</td>
<td style="text-align:left">یکپارچه‌سازی دسکتاپ/موتور برای نماهای گانت پایه</td>
</tr>
</tbody>
</table>
<h2 id="1-mpxj11-microsoft-project-exchange-در-جاوا">1. <a href="https://products.fileformat.com/project-management/java/mpxj/">MPXJ</a> (Microsoft Project eXchange در جاوا)</h2>
<h3 id="استاندارد-بیچون-و-چرای-صنعت-برای-قابلیت-تبادل-برنامهریزی"><em>استاندارد بی‌چون و چرای صنعت برای قابلیت تبادل برنامه‌ریزی</em></h3>
<p>اگر در کتابخانه‌های زمان‌بندی منبع باز یک استاندارد طلایی وجود داشته باشد، آن <strong>MPXJ</strong> است. این کتابخانه که به‌صورت فعال به‌مدت بیش از دو دهه توسط جان ایلز نگهداری می‌شود، در ابتدا برای پردازش فایل‌های MPX مایکروسافت پروجکت ساخته شد، اما به یک موتور ترجمهٔ جهانی برای فرمت‌های زمان‌بندی پروژه تبدیل شده است.</p>
<h4 id="قابلیتهای-کلیدی">قابلیت‌های کلیدی</h4>
<ul>
<li><strong>استخراج مستقیم MPP:</strong> فایل‌های باینری مالکیتی MPP را در تقریباً تمام نسخه‌های MS Project (از Project 98 تا نسخه‌های مدرن Project 2016/2019/2021/365) تجزیه و تحلیل می‌کند بدون اینکه نیاز به نصب نسخه‌ای از Microsoft Project باشد.</li>
<li><strong>تحلیل Primavera P6 XER و PMXML:</strong> پشتیبانی بومی از هر دو خروجی متنی <code>.xer</code> و فایل‌های XML مدرن Primavera.</li>
<li><strong>مدل داده نرمال‌شده:</strong> یک مدل شیء یکپارچه (<code>ProjectFile</code>، <code>Task</code>، <code>Resource</code>، <code>ResourceAssignment</code>، <code>Relation</code>، <code>WorkCalendar</code>) را ارائه می‌دهد. صرف‌نظر از اینکه ورودی شما MPP است یا XER، کد برنامه شما با همان API دقیقاً تعامل می‌کند.</li>
<li><strong>توزیع چندزبانه:</strong> اگرچه به‌صورت جاوا نوشته شده است، MPXJ بسته‌های NuGet کامپایل‌شده بومی برای <strong>.NET (C#)</strong> از طریق IKVM/CoreCLR و همچنین یک بسته <strong>Python</strong> (<code>mpxj</code> در PyPI) را توزیع می‌کند.</li>
</ul>
<h4 id="مثال-سریع-کد-جاوا">مثال سریع کد: جاوا</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">import</span> net.sf.mpxj.ProjectFile<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> net.sf.mpxj.Task<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> net.sf.mpxj.reader.UniversalProjectReader<span style="color:#f92672">;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ScheduleReader</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span><span style="color:#f92672">(</span>String<span style="color:#f92672">[]</span> args<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// UniversalProjectReader automatically detects whether it&#39;s MPP, XER, or XML
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        UniversalProjectReader reader <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> UniversalProjectReader<span style="color:#f92672">();</span>
</span></span><span style="display:flex;"><span>        ProjectFile project <span style="color:#f92672">=</span> reader<span style="color:#f92672">.</span><span style="color:#a6e22e">read</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;capital_project_schedule.xer&#34;</span><span style="color:#f92672">);</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;Project Name: &#34;</span> <span style="color:#f92672">+</span> project<span style="color:#f92672">.</span><span style="color:#a6e22e">getProjectProperties</span><span style="color:#f92672">().</span><span style="color:#a6e22e">getProjectTitle</span><span style="color:#f92672">());</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> <span style="color:#f92672">(</span>Task task <span style="color:#f92672">:</span> project<span style="color:#f92672">.</span><span style="color:#a6e22e">getTasks</span><span style="color:#f92672">())</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>task<span style="color:#f92672">.</span><span style="color:#a6e22e">getName</span><span style="color:#f92672">()</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">null</span><span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>                System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">printf</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;Task ID: %d | WBS: %s | Name: %s | Early Start: %s%n&#34;</span><span style="color:#f92672">,</span>
</span></span><span style="display:flex;"><span>                    task<span style="color:#f92672">.</span><span style="color:#a6e22e">getID</span><span style="color:#f92672">(),</span> task<span style="color:#f92672">.</span><span style="color:#a6e22e">getWBS</span><span style="color:#f92672">(),</span> task<span style="color:#f92672">.</span><span style="color:#a6e22e">getName</span><span style="color:#f92672">(),</span> task<span style="color:#f92672">.</span><span style="color:#a6e22e">getEarlyStart</span><span style="color:#f92672">());</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h4 id="جایی-که-mpxj-برتری-دارد">جایی که MPXJ برتری دارد</h4>
<ul>
<li>نرمال‌سازی واقعی بین فرمت‌ها (تبدیل MPP به PMXML یا MSPDI سازگار با XER).</li>
<li>منطق پیچیده تقویم (شیفت‌ها، استثناها، ساعات کاری چندتقویم).</li>
<li>پایداری سطح تولید با جامعه‌ای فعال.</li>
</ul>
<h2 id="2-xerparser12-پایتون">2. <a href="https://github.com/jjCode01/xerparser">xerparser</a> (پایتون)</h2>
<h3 id="تحلیلگر-سبک-وزن-بومی-پایتون-برای-primavera-xer"><em>تحلیل‌گر سبک وزن، بومی پایتون برای Primavera XER</em></h3>
<p>در حالی که MPXJ می‌تواند از طریق بایندینگ‌های پایتون فراخوانی شود، این کار نیاز به اجرای یک بک‌اند JVM (از طریق JPype) دارد. وقتی به یک پارسر بومی پایتون نیاز دارید که بدون وابستگی‌های جاوا اجرا شود، <strong><code>xerparser</code></strong> راه‌حل مناسب است.</p>
<p>یک فایل XER در واقع یک snapshot از پایگاه داده است که به متن ساده تبدیل شده است. <code>xerparser</code> این جداول را به اشیاء ساختار یافته پایتون تبدیل می‌کند و به‌صورت یکپارچه با <code>pandas</code> ادغام می‌شود.</p>
<h4 id="قابلیتهای-کلیدی-1">قابلیت‌های کلیدی</h4>
<ul>
<li><strong>بدون وابستگی به جاوا:</strong> کتابخانهٔ خالص پایتون ۳ که با <code>pip install xerparser</code> قابل نصب است.</li>
<li><strong>یکپارچگی رابطه‌ای:</strong> جدول‌های اصلی Primavera مانند <code>TASK</code> (فعالیت‌ها)، <code>PROJECT</code> (متادیتای پروژه)، <code>PROJWBS</code> (سلسله‌مراتب WBS)، <code>TASKRSRC</code> (تخصیص‌ها) و <code>TASKPRED</code> (روابط منطقی) را نگاشت می‌کند.</li>
<li><strong>اجرای سریع:</strong> ایده‌آل برای میکروسرویس‌های کانتینریزه‌شده، توابع AWS Lambda و خطوط لولهٔ مدرن ارکستراسیون داده (مانند Apache Airflow، Prefect).</li>
</ul>
<h4 id="مثال-سریع-کد-پایتون">مثال سریع کد: پایتون</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> xerparser.reader <span style="color:#f92672">import</span> Reader
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> pandas <span style="color:#66d9ef">as</span> pd
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Load XER file</span>
</span></span><span style="display:flex;"><span>xer <span style="color:#f92672">=</span> Reader(<span style="color:#e6db74">&#34;plant_expansion.xer&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Access projects inside the XER dump</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> project <span style="color:#f92672">in</span> xer<span style="color:#f92672">.</span>projects:
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Project Code: </span><span style="color:#e6db74">{</span>project<span style="color:#f92672">.</span>short_name<span style="color:#e6db74">}</span><span style="color:#e6db74">, Description: </span><span style="color:#e6db74">{</span>project<span style="color:#f92672">.</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Convert activities into a Pandas DataFrame for downstream analytics</span>
</span></span><span style="display:flex;"><span>tasks_data <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> act <span style="color:#f92672">in</span> xer<span style="color:#f92672">.</span>activities:
</span></span><span style="display:flex;"><span>    tasks_data<span style="color:#f92672">.</span>append({
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Task_Code&#34;</span>: act<span style="color:#f92672">.</span>task_code,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Name&#34;</span>: act<span style="color:#f92672">.</span>task_name,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Status&#34;</span>: act<span style="color:#f92672">.</span>status_code,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Early_Start&#34;</span>: act<span style="color:#f92672">.</span>early_start_date,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Early_Finish&#34;</span>: act<span style="color:#f92672">.</span>early_end_date,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Total_Float&#34;</span>: act<span style="color:#f92672">.</span>total_float_hr_cnt
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>df <span style="color:#f92672">=</span> pd<span style="color:#f92672">.</span>DataFrame(tasks_data)
</span></span><span style="display:flex;"><span>print(df<span style="color:#f92672">.</span>head())
</span></span></code></pre></div><h4 id="جایی-که-xerparser-برتری-دارد">جایی که xerparser برتری دارد</h4>
<ul>
<li>مهندسی داده، تجزیه و تحلیل ادعای تأخیر، و بررسی‌های سلامت برنامه (اسکریپت‌های ارزیابی ۱۴ نقطه‌ای DCMA).</li>
<li>بارهای کاری بدون سرور که بسته‌بندی یک زمان‌اجرای جاوا بیش از ۵۰ مگابایت عملی نیست.</li>
</ul>
<h2 id="۳-python-mpxj">۳. python-mpxj</h2>
<h3 id="اتصال-پایتون-با-تمام-قدرت-mpxj"><em>اتصال پایتون با تمام قدرت MPXJ</em></h3>
<p>اگر در پایتون کار می‌کنید اما <strong>باید</strong> فایل‌های باینری <code>.mpp</code> را پردازش کنید، <code>xerparser</code> نمی‌تواند به شما کمک کند زیرا فقط هدف <code>.xer</code> را دارد. قابل اعتمادترین پل منبع باز <strong><code>python-mpxj</code></strong> است.</p>
<h4 id="قابلیتهای-کلیدی-2">قابلیت‌های کلیدی</h4>
<ul>
<li>به‌صورت خودکار یک JVM جاسازی‌شده بدون رابط کاربری با استفاده از <code>jpype1</code> راه‌اندازی می‌کند.</li>
<li>API کامل MPXJ را مستقیماً برای توسعه‌دهندگان پایتون در دسترس می‌گذارد.</li>
<li>امکان تبدیل مستقیم از <code>.mpp</code> اختصاصی به فرمت‌های باز مدرن مانند <code>.json</code> یا <code>.csv</code> را فراهم می‌کند.</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip install mpxj
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> mpxj
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># MPXJ provides high-level helper utilities</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> net.sf.mpxj.reader <span style="color:#f92672">import</span> UniversalProjectReader
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>reader <span style="color:#f92672">=</span> UniversalProjectReader()
</span></span><span style="display:flex;"><span>project <span style="color:#f92672">=</span> reader<span style="color:#f92672">.</span>read(<span style="color:#e6db74">&#34;commercial_tower.mpp&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> task <span style="color:#f92672">in</span> project<span style="color:#f92672">.</span>getTasks():
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> task<span style="color:#f92672">.</span>getName():
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>task<span style="color:#f92672">.</span>getUniqueID()<span style="color:#e6db74">}</span><span style="color:#e6db74">: </span><span style="color:#e6db74">{</span>task<span style="color:#f92672">.</span>getName()<span style="color:#e6db74">}</span><span style="color:#e6db74"> -&gt; </span><span style="color:#e6db74">{</span>task<span style="color:#f92672">.</span>getDuration()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><h2 id="۴-ابزارهای-تجزیه-سفارشی-و-اسکریپتهای-واردسازی-پایگاهداده">۴. ابزارهای تجزیه سفارشی و اسکریپت‌های واردسازی پایگاه‌داده</h2>
<h3 id="پردازش-xer-خام-primavera-از-طریق-پردازش-جریان"><em>پردازش XER خام Primavera از طریق پردازش جریان</em></h3>
<p>از آنجا که XER Primavera یک قالب جدول پیش‌بینی‌پذیر دارد، بسیاری از تیم‌های مهندسی منبع باز از رمزگشای‌های جریان جدولی سفارشی (نوشته شده به Go، Python یا Rust) به جای کتابخانه‌های برنامه‌ریزی سطح بالا به سبک DOM استفاده می‌کنند.</p>
<p>ساختار یک فایل XER به صورت زیر قالب‌بندی می‌شود:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>%T  TASK
</span></span><span style="display:flex;"><span>%F  task_id  proj_id  wbs_id  task_code  task_name  status_code
</span></span><span style="display:flex;"><span>%R  10182    120      45      A1000      Mobilization TK_Complete
</span></span><span style="display:flex;"><span>%R  10183    120      45      A1010      Excavation   TK_Active
</span></span><span style="display:flex;"><span>%E
</span></span></code></pre></div><p>چندین اسکریپت منبع باز در گیت‌هاب (مانند <code>xer2sqlite</code> و <code>xer-to-csv</code>) این ساختار را مستقیماً به SQLite یا PostgreSQL تجزیه می‌کنند. این روش در صورتی بهینه است که:</p>
<ol>
<li>فقط نیاز دارید روابط جدولی را با SQL پرس‌و‌جو کنید.</li>
<li>زمان‌بندی‌ها صدها مگابایت حجم دارند و شامل ده‌ها هزار کار هستند، به‌طوری که بارگذارهای درخت‌محور شیء‌گرا باعث خطاهای کمبود حافظه می‌شوند.</li>
</ol>
<h2 id="مقایسه-فنی-کدام-را-باید-انتخاب-کنید">مقایسه فنی: کدام را باید انتخاب کنید؟</h2>
<h3 id="اگر-mpxj-را-انتخاب-کنید">اگر MPXJ را انتخاب کنید:</h3>
<ul>
<li>باید فایل‌های باینری <strong>Microsoft Project <code>.mpp</code></strong> را بدون پرداخت هزینه برای نرم‌افزارهای تجاری مالکیتی بخوانید.</li>
<li>به هوش عمیق زمان‌بندی نیاز دارید: تقویم‌های کاری، محاسبه مدت تاخیر، محاسبه مسیر بحرانی و انحراف پایه.</li>
<li>پشته فناوری شما <strong>Java</strong>، <strong>Kotlin</strong>، <strong>C# (.NET)</strong> یا پایتون سازمانی است.</li>
</ul>
<h3 id="اگر-xerparser-را-انتخاب-کنید">اگر xerparser را انتخاب کنید:</h3>
<ul>
<li>شما به‌طور انحصاری فایل‌های <strong>Primavera P6 <code>.xer</code></strong> را مدیریت می‌کنید.</li>
<li>خط لوله شما با <strong>Python بومی</strong> نوشته شده و مستقیماً به pandas، NumPy یا ابزارهای تصویری مانند Dash / Streamlit تغذیه می‌شود.</li>
<li>شما در حال استقرار در محیط‌های سبک کانتینری یا رانرهای بدون سرور ابری هستید.</li>
</ul>
<h3 id="اگر-direct-db--csv-stream-ingestion-را-انتخاب-کنید">اگر Direct DB / CSV Stream Ingestion را انتخاب کنید:</h3>
<ul>
<li>شما به مرحله‌سازی پایگاه‌داده با توان بالا برای صادرات گسترده XER چندپروژه‌ای سازمانی نیاز دارید.</li>
<li>شما فقط نیاز دارید متادیتا، حساب‌های هزینه و منحنی‌های پیشرفت را از طریق تجزیه و تحلیل SQL استخراج کنید.</li>
</ul>
<h2 id="خلاصه-و-بهترین-روشها">خلاصه و بهترین روش‌ها</h2>
<p>هنگام ساخت خطوط لوله منبع باز برای داده‌های زمان‌بندی:</p>
<ol>
<li><strong>هرگز <code>.mpp</code> را به‌صورت دستی تجزیه نکنید:</strong> مشخصات باینری مایکروسافت پیچیده و بدون مستندات است. همیشه به کتابخانه‌های آزموده‌شده مانند <strong>MPXJ</strong> تکیه کنید.</li>
<li><strong>به زمان‌مناطق تاریخ توجه کنید:</strong> برنامه‌های Primavera اغلب مدت زمان کار را بدون متادیتای منطقه زمانی ثبت می‌کنند و به تقویم‌های پروژه وابسته هستند. اطمینان حاصل کنید که خط لوله ورودی شما تغییرات شیفت‌های کاری ۸ ساعته را نسبت به روزهای تقویم ۲۴ ساعته در نظر بگیرد.</li>
<li><strong>یکپارچگی ارجاعی را اعتبارسنجی کنید:</strong> در فایل‌های XER، رکوردهای یتیم (مثلاً وظایفی که به گره‌های WBS حذف‌شده اشاره می‌کنند) به‌طور مکرر در صادرات پروژه‌های ایجاد شده به‌صورت دستی رخ می‌دهند. همیشه کلیدهای خارجی را به‌صورت پیشگیرانه در طول ETL اعتبارسنجی کنید.</li>
</ol>
<h2 id="سوالات-متداول">سوالات متداول</h2>
<p>**Q1: 1.	آیا کتابخانه‌های منبع باز می‌توانند فایل‌های باینری بومی .mpp را به‌صورت مستقیم بنویسند یا به‌روزرسانی کنند؟</p>
<p><strong>A1:</strong> نه، به دلیل فرمت باینری اختصاصی مایکروسافت، کتابخانه‌های منبع باز می‌توانند به‌طور قابل اعتماد فایل‌های .mpp را بخوانند، اما نوشتن معمولاً به فرمت‌های استانداردی مانند MSPDI (XML) یا MPX صادر می‌شود.</p>
<p>**Q2: آیا برای تجزیه این فایل‌ها نیاز دارم که Microsoft Project یا Primavera P6 بر روی سرورم نصب باشد؟</p>
<p><strong>A2:</strong> نه، کتابخانه‌هایی مانند MPXJ و xerparser پارسرهای مستقل هستند که فایل‌ها را به‌صورت مستقیم پردازش می‌کنند بدون اینکه نیاز به مجوزهای نرم‌افزار میزبان داشته باشند.</p>
<p>**Q3: بهترین کتابخانه بومی پایتون برای تجزیه فایل‌های XER Primavera P6 بدون وابستگی به جاوا چیست؟</p>
<p><strong>A3:</strong> xerparser برترین گزینهٔ خالص پایتون برای تجزیهٔ دُمپ‌های XER به‌صورت مستقیم به دیکشنری‌های بومی و DataFrameهای pandas است.</p>
<p>**Q4: آیا MPXJ می‌تواند فایل‌های MPP Microsoft Project را به فرمت‌های Primavera P6 تبدیل کند؟</p>
<p><strong>A4:</strong> بله، MPXJ می‌تواند یک فایل .mpp را بخواند و برنامه زمان‌بندی نرمال‌سازی‌شده را به فرمت PMXML سازگار با Primavera صادر کند.</p>
<p>**Q5: چرا فایل‌های XER Primavera نسبت به فایل‌های MPP Microsoft Project آسان‌تر تجزیه می‌شوند؟</p>
<p><strong>A5:</strong> فایل‌های XER قابل خواندن توسط انسان هستند، خروجی‌های پایگاه داده رابطه‌ای با جداساز تب، در حالی که فایل‌های MPP مالکیتی، ساختارهای سند ترکیبی باینری هستند.</p>
<h2 id="منابع-فرمت-فایل">منابع فرمت فایل</h2>
<p><a href="https://news.fileformat.com/"><strong>اخبار فرمت‌های فایل</strong></a> – منبع تک‌نقطه‌ای شما برای تمام اخبار مرتبط با فرمت‌های فایل از سراسر جهان <a href="https://forum.fileformat.com/"><strong>انجمن‌های فرمت فایل</strong></a> – پرسش‌های خود را در انجمن‌های فرمت فایل ارسال کنید تا اطلاعات مفید از کارشناسان فرمت فایل و کاربران جامعه دریافت کنید <a href="https://wiki.fileformat.com/"><strong>ویکی فرمت فایل</strong></a> – دسته‌بندی‌های فرمت فایل را برای اطلاعات درباره فرمت‌های مختلف بررسی کنید <a href="https://products.fileformat.com/project-management/"><strong>APIها و کتابخانه‌های منبع باز</strong> برای مدیریت پروژه</a></p>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
