문제
JMP 데이터 테이블로 가져오려는 XML 데이터가 있습니다.
이 예에서는
여기에 있는 추가 기능에 대한 JMP 사용자 커뮤니티의 RSS 피드를 사용하고 있습니다. 아래는 피드의 일부입니다.
해결책
Parse XML JSL 함수를 사용하여 XML 구조에서 텍스트를 가져와 JMP 데이터 테이블에 데이터를 삽입합니다.
Parse XML()을 사용하기 위해 이해해야 하는 세 가지 명명된 인수는 On Element, Start Tag 및 End Tag입니다.
- On Element : 특정 태그에 대해 수행할 작업을 정의합니다(시작 태그 및/또는 종료 태그 인수 사용).
- 시작 태그 : 시작 태그(예: " ")에 도달했습니다. 시작 태그 스크립트 내에서 XML Attr() 함수를 사용하여 XML 속성에 액세스할 수 있습니다.
- 종료 태그 : 종료 태그(예: "")에 도달할 때 실행할 스크립트를 정의합니다. 종료 태그 스크립트 내에서 XML Text() 함수를 사용하여 요소의 텍스트(즉, 시작 태그와 종료 태그 사이의 텍스트)에 액세스할 수 있습니다.
Parse XML 함수에 포함하는 On Element 인수의 순서는 중요하지 않습니다. 이러한 인수를 문서 위에서 아래로 내려다 보면서 각 요소를 만날 때 어떤 일이 발생해야 하는지 정의하는 것으로 생각하십시오.
시작 태그 스크립트는 요소에서 XML Attr()을 가져와야 할 때와 요소 하위 요소(또는 종료 태그) 내에 설정될 변수를 설정하거나 생성해야 할 때 사용해야 합니다. 종료 태그 스크립트는 XML 요소 텍스트(시작 태그와 종료 태그 사이)를 가져오는 데 사용해야 합니다. 이러한 시작 태그 및 종료 태그 스크립트는 모두 JMP가 실제 XML 문자열 구문 분석을 시작하기 전에 정의됩니다. 이것이 바로 배치한 순서가 중요하지 않은 이유입니다. 문자열을 구문 분석할 때 시작 또는 종료 태그가 발견되면 이러한 스크립트가 참조됩니다.
Parse XML 함수는 XML 문자열의 요소에 도달하면 해당 요소에 대해 정의된 시작 태그 스크립트가 있는지 확인하고 있는 경우 평가됩니다. 요소의 종료 태그에 도달할 때까지 각 하위 요소에 대해 이 작업을 수행합니다. 종료 태그에 도달하면 해당 요소에 대한 종료 태그 스크립트를 찾아 평가합니다(있는 경우).
rssFeed_str = Load Text File( "https://community.jmp.com/kvoqx44227/rss/board?board.id=add-ins" );
// create the data table. could also do this in the
dt = New Table( "RSS Data",
New Column( "ChannelTitle", "Character" ),
New Column( "ChannelPubDate", "Character" ),
New Column( "ChannelLink", "Character" ),
New Column( "ChannelDescription", "Character" ),
New Column( "Title", "Character" ),
New Column( "Link", "Character" ),
New Column( "Description", "Character" ),
New Column( "PubDate", "Character" ),
New Column( "Creator", "Character" )
);
// boolean value to know if we are in an item tag
inItem = 0;
Parse XML( rssFeed_str,
On Element(
"item",
Start Tag(
// turn on the inItem flag
// this is needed to differentiate between
// tags for the channel and ones for and item
inItem = 1;
// ad a row to the data table
dt << Add Rows( 1 );
// add row data to the data table for the channel
dt:ChannelTitle = channel_title;
dt:ChannelPubDate = channel_pubDate;
dt:ChannelLink = channel_link;
dt:ChannelDescription = channel_description;
),
End Tag(
// reset the inItem flag
inItem = 0;
)
),
on element(
"title",
End Tag(
// since the title tag exists for both the channel and each item,
// we want to preserve the channel title separately from the
// current item's title
// This same logic is used for the remaining elements
If( inItem == 0,
channel_title = XML Text(),
dt:Title = XML Text()
)
)
),
on element(
"link",
End Tag(
If( inItem == 0,
channel_link = XML Text(),
dt:Link = XML Text()
)
)
),
on element(
"description",
End Tag(
If( inItem == 0,
channel_description = XML Text(),
dt:Description = XML Text()
)
)
),
on element(
"pubDate",
End Tag(
If( inItem == 0,
channel_pubDate = XML Text(),
dt:PubDate = XML Text()
)
)
),
on element(
"dc:creator",
End Tag( If( inItem == 1, dt:Creator = XML Text() ) )
)
);
결과: 
논의
이 스크립트는 RSS 피드용으로 특별히 제작되었으므로 귀하의 스크립트는 위의 스크립트와 매우 다를 수 있습니다(거의 확실히 다를 것입니다). 이것이 JSL 변수를 활용하여 하위 요소에 데이터를 사용할 수 있는 방법에 대한 좋은 예가 되기를 바랍니다.
또한보십시오
스크립팅 가이드 > JMP 확장 > XML 구문 분석
필요한 사항에 따라 XML Importer 추가 기능이 모든 작업을 수행할 수도 있습니다(그러나 Parse XML을 사용하지는 않습니다).