<?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>XER on File Format Blog</title>
    <link>https://blog.fileformat.com/ko/tag/xer/</link>
    <description>Recent content in XER on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ko</language><atom:link href="https://blog.fileformat.com/ko/tag/xer/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>MS Project MPP 및 Primavera XER 파일 파싱을 위한 최고의 오픈 소스 API</title>
      <link>https://blog.fileformat.com/ko/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/ko/project-management/top-open-source-apis-for-handling-ms-project-mpp-&amp;-primavera-XER-files/</guid>
      <description>Microsoft Project MPP 및 Primavera XER 일정 파일을 읽을 수 있는 오픈 소스 도구를 찾고 계신가요? Java, Python, .NET용 MPXJ 및 xerparser와 같은 최고의 라이브러리를 확인해 보세요. </description>
      <content:encoded><![CDATA[<p><strong>마지막 업데이트</strong>: 2026년 9월 2일</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="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>) 파일 작업을 위한 주요 오픈 소스 API</h2>
<p>엔터프라이즈 프로젝트 관리에서는 두 가지 독점 파일 형식이 최고 자리를 차지합니다: **Microsoft Project (<code>.mpp</code>)**와 <strong>Oracle Primavera P6 (<code>.xer</code>)</strong>. 내부 분석 대시보드를 구축하든, 건설 일정과 ERP 시스템을 동기화하든, 혹은 프로젝트 상태 파이프라인을 자동화하든, 이러한 스케줄링 파일을 프로그래밍 방식으로 읽고 조작하는 것은 필수적인 요구 사항입니다.</p>
<p>하지만 두 형식 모두 악명 높은 엔지니어링 장벽을 제시합니다:</p>
<ul>
<li><strong>MPP files</strong>는 이진 형식이며, 문서화되지 않은 OLE Structured Storage 또는 독점 복합 문서 형식으로, 거의 모든 주요 MS Project 릴리스(2000, 2003, 2007, 2010, 2013, 2016, 2019, 2021)에서 스키마가 변경됩니다.</li>
<li><strong>Primavera XER files</strong>는 탭 구분 텍스트 내보내기로, 관계형 데이터베이스 테이블(<code>%T</code> 테이블, <code>%F</code> 필드 및 <code>%R</code> 레코드) 형태로 구조화되어 있으며, 복잡한 참조 무결성 제약, 다중 캘린더 상속 및 크리티컬 경로 로직이 포함됩니다.</li>
</ul>
<p>Aspose.Tasks와 같은 상용 SDK가 존재하지만, 라이선스 비용과 공급업체 종속성 때문에 강력한 오픈소스 대안이 필수적입니다. 이 가이드에서는 Java, Python, C# 전반에 걸쳐 MPP 및 XER 파일을 깔끔하고 효율적으로 처리할 수 있는 최고의 오픈소스 API, 라이브러리 및 파서를 자세히 살펴봅니다.</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">Java (Python / .NET 바인딩)</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">엔터프라이즈 Java, 다중 형식 변환, 올인원 일정</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">JPype를 사용한 MPXJ에 대한 파이썬식 래퍼</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">데스크톱/엔진 통합을 통한 기본 Gantt 뷰</td>
</tr>
</tbody>
</table>
<h2 id="1-mpxj11-java용-microsoft-project-교환">1. <a href="https://products.fileformat.com/project-management/java/mpxj/">MPXJ</a> (Java용 Microsoft Project 교환)</h2>
<h3 id="일정-상호-운용성을-위한-확고한-업계-표준"><em>일정 상호 운용성을 위한 확고한 업계 표준</em></h3>
<p>오픈소스 일정 관리 라이브러리에서 금본위 표준이 있다면, 바로 <strong>MPXJ</strong>입니다. Jon Iles가 20년 넘게 활발히 유지 관리해 온 MPXJ는 원래 Microsoft Project MPX 파일을 처리하기 위해 만들어졌지만, 이제는 프로젝트 일정 형식을 위한 범용 변환 엔진으로 확장되었습니다.</p>
<h4 id="핵심-기능">핵심 기능</h4>
<ul>
<li><strong>Direct MPP Extraction:</strong> 거의 모든 MS Project 버전(Project 98부터 최신 Project 2016/2019/2021/365까지)의 독점 바이너리 MPP 파일을 Microsoft Project가 설치되지 않은 상태에서도 파싱합니다.</li>
<li><strong>Primavera P6 XER &amp; PMXML Parsing:</strong> 텍스트 기반 <code>.xer</code> 덤프와 최신 Primavera XML 파일 모두에 대한 기본 지원을 제공합니다.</li>
<li><strong>Normalized Data Model:</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>Multi-Language Distribution:</strong> Java로 작성되었지만, MPXJ는 IKVM/CoreCLR을 통해 **.NET (C#)**용 네이티브 컴파일된 NuGet 패키지와 <strong>Python</strong> 패키지(<code>mpxj</code> on PyPI)를 배포합니다.</li>
</ul>
<h4 id="빠른-코드-예제-java">빠른 코드 예제: Java</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를 XER 호환 PMXML 또는 MSPDI로 변환).</li>
<li>복잡한 캘린더 로직 (교대, 예외, 다중 캘린더 근무 시간).</li>
<li>활발한 커뮤니티와 함께하는 프로덕션 수준의 안정성.</li>
</ul>
<h2 id="2-xerparser12-python">2. <a href="https://github.com/jjCode01/xerparser">xerparser</a> (Python)</h2>
<h3 id="primavera-xer용-가볍고-네이티브-python-파싱"><em>Primavera XER용 가볍고 네이티브 Python 파싱</em></h3>
<p>MPXJ를 Python 바인딩을 통해 호출할 수 있지만, 이를 위해서는 JVM 백엔드(JPype)를 실행해야 합니다. Java 의존성 없이 순수하게 네이티브 Python 파서를 필요로 할 때, **<code>xerparser</code>**가 최적의 솔루션입니다.</p>
<p>XER 파일은 본질적으로 데이터베이스 스냅샷을 평문 텍스트로 덤프한 것입니다. <code>xerparser</code>는 이러한 테이블을 구조화된 Python 객체로 디코딩하고 <code>pandas</code>와 원활하게 통합됩니다.</p>
<h4 id="핵심-기능-1">핵심 기능</h4>
<ul>
<li><strong>Zero Java Dependencies:</strong> <code>pip install xerparser</code> 로 설치 가능한 순수 Python 3 라이브러리.</li>
<li><strong>Relational Integrity:</strong> <code>TASK</code>(활동), <code>PROJECT</code>(프로젝트 메타데이터), <code>PROJWBS</code>(WBS 계층), <code>TASKRSRC</code>(할당), <code>TASKPRED</code>(논리 연결)와 같은 핵심 Primavera 테이블을 매핑합니다.</li>
<li><strong>Fast Execution:</strong> 컨테이너화된 마이크로서비스, AWS Lambda 함수, 최신 데이터 오케스트레이션 파이프라인(예: Apache Airflow, Prefect)에 이상적입니다.</li>
</ul>
<h4 id="빠른-코드-예시-python">빠른 코드 예시: Python</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 14점 평가 스크립트).</li>
<li>50MB 이상의 Java 런타임을 번들링하기가 비현실적인 서버리스 워크로드.</li>
</ul>
<h2 id="3-python-mpxj">3. python-mpxj</h2>
<h3 id="python을-mpxj의-전체-기능과-연결"><em>Python을 MPXJ의 전체 기능과 연결</em></h3>
<p>Python으로 작업하지만 <strong>반드시</strong> 바이너리 <code>.mpp</code> 파일을 처리해야 한다면, <code>xerparser</code>는 <code>.xer</code>만을 대상으로 하기 때문에 도움이 되지 않습니다. 가장 신뢰할 수 있는 오픈소스 브릿지는 **<code>python-mpxj</code>**입니다.</p>
<h4 id="핵심-기능-2">핵심 기능</h4>
<ul>
<li><code>jpype1</code>을 사용하여 헤드리스 임베디드 JVM을 자동으로 시작합니다.</li>
<li>전체 MPXJ API를 Python 개발자에게 직접 노출합니다.</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="4-맞춤-파싱-유틸리티-및-데이터베이스-인제스트-스크립트">4. 맞춤 파싱 유틸리티 및 데이터베이스 인제스트 스크립트</h2>
<h3 id="스트림-처리를-통한-원시-primavera-xer-처리"><em>스트림 처리를 통한 원시 Primavera XER 처리</em></h3>
<p>Primavera XER가 예측 가능한 테이블 형식을 따르기 때문에, 많은 오픈소스 엔지니어링 팀은 고수준 DOM 스타일 일정 라이브러리 대신 (Go, Python, Rust로 작성된) 맞춤형 표 스트림 디코더를 활용합니다.</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>GitHub에 있는 여러 오픈소스 스크립트(예: <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> 또는 엔터프라이즈 Python인 경우.</li>
</ul>
<h3 id="xerparser를-선택해야-하는-경우">xerparser를 선택해야 하는 경우:</h3>
<ul>
<li>오직 <strong>Primavera P6 <code>.xer</code></strong> 파일만 다루는 경우.</li>
<li>파이프라인이 <strong>native Python</strong>으로 작성되어 pandas, NumPy 또는 Dash / Streamlit과 같은 시각화 도구에 직접 연결되는 경우.</li>
<li>경량 컨테이너 환경이나 서버리스 클라우드 러너에 배포하고 있습니다.</li>
</ul>
<h3 id="direct-db--csv-스트림-인제션을-선택해야-하는-경우">Direct DB / CSV 스트림 인제션을 선택해야 하는 경우:</h3>
<ul>
<li>대규모 다중 프로젝트 엔터프라이즈 XER 내보내기를 위한 고처리량 데이터베이스 스테이징이 필요합니다.</li>
<li>SQL 분석을 통해 메타데이터, 비용 계정 및 진행 곡선만 추출하면 됩니다.</li>
</ul>
<h2 id="요약-및-모범-사례">요약 및 모범 사례</h2>
<p>일정 데이터용 오픈소스 파이프라인을 구축할 때:</p>
<ol>
<li><strong><code>.mpp</code>를 수동으로 파싱하지 마세요:</strong> Microsoft 바이너리 사양은 복잡하고 문서화되지 않았습니다. 항상 <strong>MPXJ</strong>와 같은 검증된 라이브러리를 사용하세요.</li>
<li><strong>날짜 시간대에 주의하세요:</strong> Primavera 일정은 종종 프로젝트 캘린더에 의존하여 시간대 메타데이터 없이 작업 기간을 기록합니다. 데이터 수집 파이프라인이 8시간 근무 교대와 24시간 캘린더 일 사이의 차이를 고려하도록 하세요.</li>
<li><strong>참조 무결성을 검증하세요:</strong> XER 파일에서는 수동으로 만든 프로젝트 내보내기에서 고아 레코드(예: 삭제된 WBS 노드를 가리키는 작업)가 자주 발생합니다. ETL 과정에서 외래 키를 항상 방어적으로 검증하세요.</li>
</ol>
<h2 id="자주-묻는-질문">자주 묻는 질문</h2>
<p>**Q1: 1.	오픈소스 라이브러리가 네이티브 바이너리 .mpp 파일을 직접 작성하거나 업데이트할 수 있나요?</p>
<p><strong>A1:</strong> 아니요, Microsoft의 독점 바이너리 형식 때문에 오픈소스 라이브러리는 .mpp 파일을 신뢰성 있게 읽을 수 있지만, 쓰기는 일반적으로 MSPDI (XML) 또는 MPX와 같은 표준 형식으로 내보냅니다.</p>
<p>**Q2: 이 파일들을 파싱하기 위해 서버에 Microsoft Project 또는 Primavera P6를 설치해야 합니까?</p>
<p><strong>A2:</strong> 아니요, MPXJ와 xerparser와 같은 라이브러리는 호스트 소프트웨어 라이선스를 요구하지 않고 파일을 직접 처리하는 독립 파서입니다.</p>
<p>**Q3: Java 의존성 없이 Primavera P6 XER 파일을 파싱하기 위한 최고의 순수 Python 라이브러리는 무엇입니까?</p>
<p><strong>A3:</strong> xerparser는 XER 덤프를 직접 네이티브 딕셔너리와 pandas DataFrame으로 파싱하는 최고의 순수 Python 선택입니다.</p>
<p>**Q4: MPXJ가 Microsoft Project MPP 파일을 Primavera P6 형식으로 변환할 수 있습니까?</p>
<p><strong>A4:</strong> 예, MPXJ는 .mpp 파일을 읽고 정규화된 일정을 Primavera 호환 PMXML 형식으로 내보낼 수 있습니다.</p>
<p>**Q5: Primavera XER 파일이 Microsoft Project MPP 파일보다 파싱하기 쉬운 이유는 무엇입니까?</p>
<p><strong>A5:</strong> XER 파일은 사람이 읽을 수 있는 탭 구분 관계형 데이터베이스 덤프이며, MPP 파일은 독점적인 바이너리 복합 문서 구조입니다.</p>
<h2 id="파일-형식-리소스">파일 형식 리소스</h2>
<p><a href="https://news.fileformat.com/"><strong>파일 포맷 뉴스</strong></a> – Your one stop for all the news related to file formats from around the world <a href="https://forum.fileformat.com/"><strong>파일 포맷 포럼</strong></a> – Post your queries in file format forums to get useful information from file format experts and community users <a href="https://wiki.fileformat.com/"><strong>파일 포맷 위키</strong></a> –Explore file format categories for information about various file formats <a href="https://products.fileformat.com/project-management/"><strong>프로젝트 관리용 오픈 소스 API 및 라이브러리</strong></a></p>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
