Как разобрать неверный XML

У меня есть проект, над которым я работаю, где я запрашиваю XML-документ с сервера и анализирую его для импорта данных в мою систему. Я использую Ruby 2.4.3.

Моя проблема заключается в том, что XML поставляется с тегами элементов, имена которых начинаются с цифр. Nokogiri видит эти теги как часть содержимого предыдущего тега и портит остальную часть документа.

Я использую Mechanize для запроса данных. Любые идеи о том, куда идти?

Единственное, о чем я могу думать, - это написать полностью настраиваемый парсер в Mechanize, чего я бы не хотел делать.

Я также думал о том, чтобы сначала проанализировать xml как строку, чтобы переименовать эти элементы, но не был уверен, что это самый чистый способ сделать это. Любой совет высоко ценится.

Вот пример данных, которые я анализирую

<Rooms>\r
          <2ndBedroomArea>144</2ndBedroomArea>\r
          <2ndKitchenArea>144</2ndKitchenArea>\r
          <3rdBedroomArea>168</3rdBedroomArea>\r
          <4thBedroomArea>156</4thBedroomArea>\r
          <FamilyRoomArea>368</FamilyRoomArea>\r
          <FormalDiningRoomArea>144</FormalDiningRoomArea>\r
          <GreatRoomArea>0</GreatRoomArea>\r
          <InformalDiningRoomArea>187</InformalDiningRoomArea>\r
          <KitchenArea>168</KitchenArea>\r
          <LaundryRoomArea>84</LaundryRoomArea>\r
          <LivingRoomArea>272</LivingRoomArea>\r
          <MasterBedroomArea>238</MasterBedroomArea>\r
          <OfficeArea>144</OfficeArea>\r
          <RecreationRoomArea>0</RecreationRoomArea>\r
          <2ndBedroomDim>12 x 12</2ndBedroomDim>\r
          <2ndKitchenDim>12 x 12</2ndKitchenDim>\r
          <3rdBedroomDim>12 x 14</3rdBedroomDim>\r
          <4thBedroomDim>13 x 12</4thBedroomDim>\r
          <FamilyRoomDim>16 x 23</FamilyRoomDim>\r
          <FormalDiningRoomDim>12 x 12</FormalDiningRoomDim>\r
          <GreatRoomDim>0 x 0</GreatRoomDim>\r
          <InformalDiningRoomDim>17 x 11</InformalDiningRoomDim>\r
          <KitchenDim>14 x 12</KitchenDim>\r
          <LaundryRoomDim>6 x 14</LaundryRoomDim>\r
          <LivingRoomDim>17 x 16</LivingRoomDim>\r
          <MasterBedroomDim>17 x 14</MasterBedroomDim>\r
          <OfficeDim>12 x 12</OfficeDim>
          <RecreationRoomDim>0 x 0</RecreationRoomDim>\r
          <2ndBedroomLen>12</2ndBedroomLen>\r
          <2ndKitchenLen>12</2ndKitchenLen>\r
          <3rdBedroomLen>12</3rdBedroomLen>\r
          <4thBedroomLen>13</4thBedroomLen>\r
          <FamilyRoomLen>16</FamilyRoomLen>\r
          <FormalDiningRoomLen>12</FormalDiningRoomLen>\r
          <GreatRoomLen>0</GreatRoomLen>\r
          <InformalDiningRoomLen>17</InformalDiningRoomLen>\r
          <KitchenLen>14</KitchenLen>\r
          <LaundryRoomLen>6</LaundryRoomLen>\r
          <LivingRoomLen>17</LivingRoomLen>\r
          <MasterBedroomLen>17</MasterBedroomLen>\r
          <OfficeLen>12</OfficeLen>\r
          <RecreationRoomLen>0</RecreationRoomLen>\r
          <2ndBedroomWid>12</2ndBedroomWid>\r
          <2ndKitchenWid>12</2ndKitchenWid>\r
          <3rdBedroomWid>14</3rdBedroomWid>\r
          <4thBedroomWid>12</4thBedroomWid>\r
          <FamilyRoomWid>23</FamilyRoomWid>\r
          <FormalDiningRoomWid>12</FormalDiningRoomWid>\r
          <GreatRoomWid>0</GreatRoomWid>\r
          <InformalDiningRoomWid>11</InformalDiningRoomWid>\r
          <KitchenWid>12</KitchenWid>\r
          <LaundryRoomWid>14</LaundryRoomWid>\r
          <LivingRoomWid>16</LivingRoomWid>\r
          <MasterBedroomWid>14</MasterBedroomWid>\r
          <OfficeWid>12</OfficeWid>\r
          <RecreationRoomWid>0</RecreationRoomWid>\r
          <5thBedroomArea>0</5thBedroomArea>\r
          <5thBedroomDim>0 x 0</5thBedroomDim>\r
          <5thBedroomLen>0</5thBedroomLen>\r
          <5thBedroomWid>0</5thBedroomWid>\r
          <6thBedroomArea>0</6thBedroomArea>\r
          <6thBedroomDim>0 x 0</6thBedroomDim>\r
          <6thBedroomLen>0</6thBedroomLen>\r
          <6thBedroomWid>0</6thBedroomWid>\r
        </Rooms>\r

1 ответ

Nokogiri::HTML гораздо более разрешительный. Потребуются некоторые корректировки, но он может разобрать.

Другие вопросы по тегам