2017-12-23 10 views
1

Ich habe ein Projekt, an dem ich arbeite, wo ich ein XML-Dokument von einem Server anfordern und es analysieren, um die Daten in mein System zu importieren. Ich benutze Ruby 2.4.3.Wie man ein ungültiges XML analysiert

Meine Probleme ist, dass das XML mit Element-Tags kommt, deren Namen mit Zahlen beginnen. Nokogiri sieht diese Tags als Teil des vorherigen Tag-Inhalts und vermasselt den Rest des Dokuments.

Ich verwende Mechanize, um die Daten anzufordern. Irgendwelche Ideen welchen Weges zu gehen?

Das einzige, was mir einfällt, ist einen komplett benutzerdefinierten Parser in Mechanize zu schreiben, den ich lieber nicht machen würde.

Ich dachte auch über das Parsen der XML als String nach, zuerst um diese Elemente umzubenennen, aber war nicht sicher, ob das der sauberste Weg war, es zu tun. Jeder Rat wird sehr geschätzt. Hier

ist ein Beispiel für die Daten, die ich Parsen bin

<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 
+0

Für den Fall, dass irgendjemand später darauf stößt, habe ich diesen Teil von regexp verwendet, um es zu reparieren:/<(\d).*\>. * \ <\/(\1).*>. */Es funktioniert für mein vorhersehbares Muster von ungültigem SQL. Ich habe nur "3" für "Thi" in beiden gefangenen Gruppen. – user1977840

Antwort

0

Nokogiri::HTML ist viel freizügiger. Es wird einige Anpassungen benötigen, aber es kann es analysieren.

Verwandte Themen