嗨,
我正在尝试解析一些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" );
)
)
)
)
);
这是输出数据表:
