我正在尝试从包含无效元素的XML文档中删除对象。例如,我想在面对以下内容时删除整个METAR对象(注意 raw_text 标记格式错误):
<METAR>
<raw_text>KEHY 141755Z AUTO 26027G38KT 10SM UP SCTr_degrees>160</wind_dir_degrees>
<wind_speed_kt>7</wind_speed_kt>
<visibility_statute_mi>10.0</visibility_statute_mi>
<altim_in_hg>29.97933</altim_in_hg>
<quality_control_flags>
<auto>TRUE</auto>
<auto_station>TRUE</auto_station>
</quality_control_flags>
<sky_condition sky_cover="FEW" cloud_base_ft_agl="4900" />
<sky_condition sky_cover="SCT" cloud_base_ft_agl="6000" />
<flight_category>VFR</flight_category>
<metar_type>METAR</metar_type>
<elevation_m>106.0</elevation_m>
</METAR>
但是,我想保留这样的有效内容:
<METAR>
<raw_text>KELA 141755Z AUTO 14007KT 10SM BKN008 BKN065 OVC085 17/15 A2995 RMK AO2 T01730153 10175 20108</raw_text>
<station_id>KELA</station_id>
<observation_time>2016-01-14T17:55:00Z</observation_time>
<latitude>29.6</latitude>
<longitude>-96.32</longitude>
<temp_c>17.3</temp_c>
<dewpoint_c>15.3</dewpoint_c>
<wind_dir_degrees>140</wind_dir_degrees>
<wind_speed_kt>7</wind_speed_kt>
<visibility_statute_mi>10.0</visibility_statute_mi>
<altim_in_hg>29.949802</altim_in_hg>
<quality_control_flags>
<auto>TRUE</auto>
<auto_station>TRUE</auto_station>
</quality_control_flags>
<sky_condition sky_cover="BKN" cloud_base_ft_agl="800" />
<sky_condition sky_cover="BKN" cloud_base_ft_agl="6500" />
<sky_condition sky_cover="OVC" cloud_base_ft_agl="8500" />
<flight_category>IFR</flight_category>
<maxT_c>17.5</maxT_c>
<minT_c>10.8</minT_c>
<metar_type>METAR</metar_type>
<elevation_m>56.0</elevation_m>
</METAR>
我设计了一个在notepad ++和regexlib.com中运行的正则表达式,但是当我尝试在C#应用程序中运行它时,正则表达式并替换每个METAR对象:
<METAR>(?:(?:(?!</?METAR>).)*)<([^/>]+?)>[^<]+</(?:(?:(?!$1).)+?)>(?:(?:(?!<?METAR>).)*)</METAR>
那里的任何正则表达大师都在乎给我一只手?!提前谢谢。
添
Edit:
我已阅读this question并且不相信这是重复的。我的问题是关于使用正则表达式删除无效的XML,特别是为什么我的表达式在C#中不起作用,但在其他应用程序中也没问题。