2017-07-11 8 views
1

いくつかのSASデータセットにXMLファイルを読み込みたいとします。 SAS XMLマップでは、X-Path(バージョン1)を使用してXML内の行を生成する要素と、列の値を含む要素または属性を参照するその他のX-Paht式を参照します。残念ながら、私が検索した値は必ずしも必要な行にリンクされているわけではありません。TABLE PATH SAS XML MAPSに対する列PATHの表現方法

簡単な例:このXMLからわき

探しを

<?xml version="1.0" encoding="iso-8859-1" ?> 
<street> 
    <house> 
     <houseNumber>1</houseNumber> 
     <resident>Albert</resident> 
     <pet>dog</pet> 
    </house> 
    <house> 
     <houseNumber>2</houseNumber> 
     <resident>Bea</resident> 
     <resident>Clemance</resident> 
    </house> 
    <house> 
     <houseNumber>3</houseNumber> 
     <!--remark: for sale--> 
    </house> 
    <house> 
     <houseNumber>4</houseNumber> 
     <resident>Dave</resident> 
     <resident>Eve</resident> 
     <pet>Cat</pet> 
    </house> 
</street> 

私は、このデータ

Obs houseNumber name  pet 
1    1 Albert  dog 
2    2 Bea    
3    2 Clemance  
4    4 Dave  cat 
5    4 Eve   cat 

しかし、このマップ

<?xml version="1.0" encoding="UTF-8"?> 

<SXLEMAP name="AUTO_GEN" version="2.1"> 
    <NAMESPACES count="0"/> 
    <TABLE description="residents" name="resident"> 
     <TABLE-PATH syntax="XPath">resident</TABLE-PATH> 
     <COLUMN name="houseNumber" retain="YES"> 
      <PATH syntax="XPath">houseNumber</PATH> 
      <TYPE>numeric</TYPE> 
      <DATATYPE>integer</DATATYPE> 
     </COLUMN> 
     <COLUMN name="name"> 
      <PATH syntax="XPath">resident</PATH> 
      <TYPE>character</TYPE> 
      <DATATYPE>string</DATATYPE> 
      <LENGTH>32</LENGTH> 
     </COLUMN> 
     <COLUMN name="pet"> 
      <PATH syntax="XPath">pet</PATH> 
      <TYPE>character</TYPE> 
      <DATATYPE>string</DATATYPE> 
      <LENGTH>32</LENGTH> 
     </COLUMN> 
    </TABLE> 
</SXLEMAP> 

を使用して、これを抽出したいと思いますタラ電子

filename SXLELIB 'C:\MyFolder\xml.xml'; 
filename SXLEMAP 'C:\MyFolder\map.map'; 
libname SXLELIB xmlv2 xmlmap=SXLEMAP access=READONLY; 

proc print data=SXLELIB.resident(obs=100); 
run; 

私はこの取得:

Obs houseNumber name  pet 
1    1 Albert  
2    2 Bea   bird 
3    2 Clemance  
4    4 Dave   
5    4 Eve    

_thisはverry簡単な例ですが、ジョーはエレガントな2017年7月12日に解決します。 しかし、彼の解決策は、それゆえ私は

より複雑な例として供給し、私の実際の生活の問題のために動作しません:私は

を抽出したいと思い、このXMLからheterogeneour名

<?xml version="1.0" encoding="iso-8859-1" ?> 
<street> 
    <house> 
     <houseNumber>1</houseNumber> 
     <adult> 
      <name>Albert</name> 
      <age>41</age> 
     </adult> 
     <child> 
      <name>Ken</name> 
      <age>1</age> 
     </child> 
    </house> 
    <house> 
     <houseNumber>2</houseNumber> 
     <adult> 
      <name>Bea</name> 
      <age>42</age> 
     </adult> 
     <adult> 
      <name>Clemance</name> 
      <age>43</age> 
     </adult> 
    </house> 
    <appartment> 
     <houseNumber>3</houseNumber> 
     <suiteNumber>1</suiteNumber> 
     <!--remark: for rent--> 
    </appartment> 
    <appartment> 
     <houseNumber>3</houseNumber> 
     <suiteNumber>2</suiteNumber> 
     <adult> 
      <name>Ivette</name> 
      <age>45</age> 
     <adult> 
     <adult> 
      <name>Jacque</name> 
      <age>51</age> 
     <adult> 
     <child> 
      <name>Lea</name> 
      <age>2</age> 
     </child> 
     <child> 
      <name>Marie</name> 
      <age>3</age> 
     </child> 
    </appartment> 
    <appartment> 
     <houseNumber>3</houseNumber> 
     <suiteNumber>2</suiteNumber> 
     <adult> 
      <name>Henri</name> 
      <age>44</age> 
     <adult> 
    </appartment> 
    <house> 
     <houseNumber>4</houseNumber> 
     <adult> 
      <name>Dave</name> 
      <age>46</age> 
     </adult> 
     <adult> 
      <name>Eve</name> 
      <age>51</age> 
     </adult> 
    </house> 
    <house> 
     <houseNumber>5</houseNumber> 
     <adult> 
      <name>Francis</name> 
      <age>47</age> 
     </adult> 
     <adult> 
      <name>Gertrude</name> 
      <age>48</age> 
     </adult> 
    </house> 
    <house> 
     <houseNumber>6</houseNumber> 
     <!--remark: for sale--> 
    </house> 
</street> 

Obs name  age number suite 
1 Albert  41 1 . 
2 Ken   1  1 . 
3 Bea   42 2 . 
4 Clemance 43 2 . 
5 Ivette  45 3 2 
6 Jacque  45 3 2 
7 Lea   2  3 2 
8 Marie  3  3 2 
9 Henri  44 3 3 
10 Dave  46 4 . 
11 Eve   51 4 . 
12 Francis  47 5 . 
13 Gertrude 48 5 . 

名前からの相対アドレスを使用してください。

<TABLE description="relative address from name" name="resident_1"> 
    <TABLE-PATH syntax="XPath">name</TABLE-PATH> 
    <COLUMN name="name"> 
     <PATH syntax="XPath">.</PATH> 
     <TYPE>character</TYPE> 
     <DATATYPE>string</DATATYPE> 
     <LENGTH>32</LENGTH> 
    </COLUMN> 
    <COLUMN name="age" retain="YES"> 
     <PATH syntax="XPath">../age</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
    <COLUMN name="number"> 
     <PATH syntax="XPath">../../number</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
    <COLUMN name="suite"> 
     <PATH syntax="XPath">../../suiteNumber</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
</TABLE> 

しかし、それは私だけ与え欠損値は

だから、私は絶対アドレス

良いです
<TABLE description="name based absolute addresses" name="resident_2"> 
    <TABLE-PATH syntax="XPath">name</TABLE-PATH> 
    <COLUMN name="name"> 
     <PATH syntax="XPath">name</PATH> 
     <TYPE>character</TYPE> 
     <DATATYPE>string</DATATYPE> 
     <LENGTH>32</LENGTH> 
    </COLUMN> 
    <COLUMN name="age" retain="YES"> 
     <PATH syntax="XPath">age</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
    <COLUMN name="number"> 
     <PATH syntax="XPath">houseNumber</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
    <COLUMN name="suite"> 
     <PATH syntax="XPath">suiteNumber</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
</TABLE> 

を試してみましたが、値が忘れられているとLEAは二つの問題

  • で私をVES一度使用しても、私はまだ値がないソムを持っています
  • 年齢が名前の後に来るにつれて、年齢はあまりにも遅く、henc eは下向き

シフト:

Obs name  age number suite 
1 Albert  .  1 . 
2 Ken   41 . . 
3 Bea   1  2 . 
4 Clemance 42 . . 
5 Ivette  43 3 2 
6 Jacque  45 . . 
7 Lea   45 . . 
8 Marie  2  . . 
9 Henri  3  3 3 
10 Dave  44 4 . 
11 Eve   46 . . 
12 Francis  51 5 . 
13 Gertrude 47 . . 

だから私はage代わりのnameから始まり、また、二つの問題

と私VESリーで保持オプション
<TABLE description="age based absolute addresses" name="resident_3"> 
    <TABLE-PATH syntax="XPath">age</TABLE-PATH> 
    <COLUMN name="name"> 
     <PATH syntax="XPath">name</PATH> 
     <TYPE>character</TYPE> 
     <DATATYPE>string</DATATYPE> 
     <LENGTH>32</LENGTH> 
    </COLUMN> 
    <COLUMN name="age" retain="YES"> 
     <PATH syntax="XPath">age</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
    <COLUMN name="number" retain="yes"> 
     <PATH syntax="XPath">houseNumber</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
    <COLUMN name="suite" retain="yes"> 
     <PATH syntax="XPath">suiteNumber</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 
</TABLE> 

を使用してみました
  • houuseとsuite numbeとしてrsはeve rのために保持され、あまりに長くドラッグします。
  • 私は年齢が不足している人がいませんジャック・)

Obs name  age number suite 
1 Albert 41 1 . 
2 Ken  1  1 . 
3 Bea  42 2 . 
4 Clemance 43 2 . 
5 Ivette 45 3 2 
6 Lea  2  3 2 
7 Marie  3  3 2 
8 Henri  44 3 3 
9 Dave  46 4 3 
10 Eve  51 4 3 
11 Francis 47 5 3 
12 Gertrude 48 5 3 

誰もがよりよい解決策を持っていますか?

本当の問題:私は私が外国のアカウントを報告してxmlファイルに書いたアドレスデータをリードバックするために作成したファイルからアドレスデータをリードバックするために無駄にしようとした後、私の質問を提起したCRSからアドレスまたはFATCAファイル

を読みます所有者は、Common Reporting Standard User Guide

アドレスは、最初に発生するResCountryCodeの1つの欄しか持たない。それらは、蛾IndividualおよびOrganizationで発生する。

答えて

1

私はそれが単一テーブルとしてXPathでこれを行うことが可能だと思いますが、私の経験では、XPathの親子兄弟要素のSASサポート(これを正しく指定するために使用する必要があるでしょう) 貧乏です。

2つのテーブルとしてインポートしてマージする方がずっと簡単です。 SASはこれを非常にきれいにサポートしています。

2つのテーブルを使用して、1つは "常駐"のオートマップ、もう1つは "ペット"のオートマップです。これは簡単に実行できます。

filename SXLELIB 'C:\temp\test.xml'; 
filename SXLEMAP 'C:\temp\test.map'; 
libname SXLELIB xmlv2 xmlmap=SXLEMAP access=READONLY; 

proc print data=SXLELIB.resident(obs=100); 
run; 
proc print data=SXLELIB.pet(obs=100); 
run; 

house_ordinalとマージすると完了です。ここで

は詳細です:

<TABLE description="house" name="pet"> 
    <TABLE-PATH syntax="XPath">/street/house/pet</TABLE-PATH> 

    <COLUMN class="ORDINAL" name="house_ORDINAL"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/street/house</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

    <COLUMN name="houseNumber"> 
     <PATH syntax="XPath">/street/house/houseNumber</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

    <COLUMN name="pet"> 
     <PATH syntax="XPath">/street/house/pet</PATH> 
     <TYPE>character</TYPE> 
     <DATATYPE>string</DATATYPE> 
     <LENGTH>3</LENGTH> 
    </COLUMN> 

</TABLE> 

<TABLE description="resident" name="resident"> 
    <TABLE-PATH syntax="XPath">/street/house/resident</TABLE-PATH> 

    <COLUMN class="ORDINAL" name="house_ORDINAL"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/street/house</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

    <COLUMN class="ORDINAL" name="resident_ORDINAL"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/street/house/resident</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

    <COLUMN name="resident"> 
     <PATH syntax="XPath">/street/house/resident</PATH> 
     <TYPE>character</TYPE> 
     <DATATYPE>string</DATATYPE> 
     <LENGTH>8</LENGTH> 
    </COLUMN> 

</TABLE> 
+0

おかげでジョー。これは私が上に提出した単純化された問題を解決するが、私は本当に複雑な問題を解決しない。私は後でその理由を示すために質問を編集します。 –

関連する問題