正则表达式删除无效的XML

时间:2017-10-03 14:51:57

标签: c# regex xml

我正在尝试从包含无效元素的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#中不起作用,但在其他应用程序中也没问题。

0 个答案:

没有答案