嗨,
我正在嘗試解析一些XML並且遇到相當困難的時間。特別是,試圖獲得體育場(AT&T中心)或城市和州的名稱。見下文。
我可以使用“On Element()”和“XML Attr()”輕鬆解析“event-metadata”元素或“site-metadata”元素中的任何內容。在我看來,體育場名稱應該是元素“名稱”的屬性,但JMP似乎並沒有這樣認識它。
此處提供了XML的在線版本: http://showcase.xmlteam.com/open_rendition.php?id=2129
任何幫助將非常感激。也許出版商標記的方式存在問題?
謝謝
-麥克風
<運動事件>
<事件的元數據的xmlns:FS =“ 的java.io.File “ 日期覆蓋型 =“ 事件 “ 事件的關鍵 =“ l.nba.com-e.896939 “ 事件狀態 =“ 預事件 “ 日期覆蓋值 =“ l.nba.com-e.896939 “ 啟動日期時間 =“ 20160114T200000-0500 “ 時間確定 =“ 某些 “ 事件名稱 =“ 常規賽季 “ 網站定位 =“ 家 “ >
<站點>
<站點的元數據網站鍵 =“ l.nba.com-s.538102 “ 容量 =“ 18581 “ >
<名充分 =“ AT&T中心 “ />
<家位置市 =“ 聖安東尼奧 “ 州 =“ 德州 “ 國家 =“ 美國 “ />
@ michaelgingras7 中寫道:
最大的問題是出版商雙重使用“名稱”元素並弄清楚如何解析它。
我發現這是解析XML的一個更大的挑戰。關鍵是使用JSL變量來了解父元素是什麼(如我的'inSite'和'inTeam'變量所示)。
michaelgingras7寫道:解析XML最令人沮喪的部分是試圖弄清楚錯誤的位置,因為你無法單步執行它。
我同意。由於一切都是使用Parse XML一步完成的,因此很難直觀地了解正在發生的事情。有時我會在開始/結束標記腳本中使用Print或Show語句來查看發生的事件的順序。
嗨賈斯汀,
感謝您的大力幫助。最大的問題是出版商雙重使用“名稱”元素並弄清楚如何解析它。
另一個問題是我試圖在我的Parse XML()中解析“name”兩次。這也導致了錯誤。
解析XML最令人沮喪的部分是試圖弄清楚錯誤的位置,因為你無法單步執行它。
再次感謝。
-麥克風
當直接使用XML作為字符串時,'AT&T Center'中的&符可能會導致問題。這是因為apersand是XML中的轉義字符。你可以用'&amp;'來逃避這個角色但是如果直接從網站加載XML字符串則沒有必要。
下面是我解析這個XML文檔的實現。
// I needed to escape the '&' character in 'AT&T Center' when using a regular string
xmlStr =
"\[
<SPORTS-EVENT>
<EVENT-METADATA fs="java.io.File" date-coverage-type="event" event-key="l.nba.com-e.896939" event-status="pre-event" date-coverage-value="l.nba.com-e.896939" start-date-time="20160114T200000-0500" time-certainty="certain" event-name="Regular Season" site-alignment="home">
<SITE>
<SITE-METADATA site-key="l.nba.com-s.538102" capacity="18581">
<NAME full="AT&T Center"></NAME>
<HOME-LOCATION city="San Antonio" state="Texas" country="USA"></HOME-LOCATION>
</SITE-METADATA>
<SITE-STATS></SITE-STATS>
</SITE>
</EVENT-METADATA>
<TEAM id="l.nba.com-t.21">
<TEAM-METADATA fs="java.io.File" team-key="l.nba.com-t.21" alignment="home">
<NAME first="San Antonio" last="Spurs"></NAME>
</TEAM-METADATA>
<TEAM-STATS date-coverage-type="season-regular"></TEAM-STATS>
</TEAM>
<TEAM id="l.nba.com-t.11">
<TEAM-METADATA fs="java.io.File" team-key="l.nba.com-t.11" alignment="away">
<NAME first="Cleveland" last="Cavaliers"></NAME>
</TEAM-METADATA>
<TEAM-STATS date-coverage-type="season-regular"></TEAM-STATS>
</TEAM>
</SPORTS-EVENT>]\";
// loading the string directly from the website works fine
xmlStr = Load Text File( "http://showcase.xmlteam.com/open_rendition.php?id=2129" );
nt = New Table(
"NBA Sporting events",
New Column("StartTime", Character),
New Column("HomeTeamFirst", Character),
New Column("HomeTeamLast", Character),
New Column("AwayTeamFirst", Character),
New Column("AwayTeamLast", Character),
New Column("City", Character),
New Column("State", Character),
New Column("Country", Character),
New Column("ArenaName", Character)
);
iRow = 0;
Parse XML(
xmlStr,
On Element(
"sports-event",
Start Tag(
nt << add row(1);
iRow++;
)
),
On Element(
"event-metadata",
Start Tag(
nt:StartTime[iRow] = XML Attr( "start-date-time" );
)
),
On Element(
"home-location",
Start Tag(
nt:City[iRow] = XML Attr( "city" );
nt:State[iRow] = XML Attr( "state" );
nt:Country[iRow] = XML Attr( "country" );
)
),
On Element(
"site",
Start Tag(
inSite = 1;
),
End Tag(
inSite = 0;
)
),
On Element(
"team",
Start Tag(
inTeam = 1;
),
End Tag(
inTeam = 0;
)
),
On Element(
"team-metadata",
Start Tag(
alignment = XML Attr("alignment");
)
),
On Element(
"name",
Start Tag(
If(
inSite == 1,
nt:ArenaName[iRow] = XML Attr( "full" ),
inTeam == 1,
Match( alignment,
"home",
nt:HomeTeamFirst[iRow] = XML Attr( "first" );
nt:HomeTeamLast[iRow] = XML Attr( "last" );
,
"away",
nt:AwayTeamFirst[iRow] = XML Attr( "first" );
nt:AwayTeamLast[iRow] = XML Attr( "last" );
)
)
)
)
);
這是輸出數據表:
