Cześć.
stack: node.js, typescript, sax
Streamuję plik XML przy użyciu wbudowanego modułu node fs oraz paczki sax. XML ma następującą strukturę:
<?xml version="1.0" encoding="UTF-8" ?>
<offers>
<offer>(węzeł do którego chcę sie dostać)</offer>
<offer>(węzeł do którego chcę sie dostać)</offer>
<offer>(węzeł do którego chcę sie dostać)</offer>
<offer>(węzeł do którego chcę sie dostać)</offer>
<offer>(węzeł do którego chcę sie dostać)</offer>
<-- bardzo dużo takich węzłów, plik 2gb -->
</offers>
Potrzebuję dostać się po kolei do każdego węzła <offer> i odczytać z niego dane następnie podjąć na ich podstawie decyzję i dodać tag wewnątrz każdego węzła odpowiadający. po dodaniu tagu całość ma być zapisywana w innym pliku.
Utknąłem w miejscu, gdzie mam odczytać dane z węzła.
przykładowy węzeł <offer>
<offer>
<id><![CDATA[7684]]></id>
<name><![CDATA[Incredible Frozen Pants]]></name>
<category><![CDATA[Tasty]]></category>
<description><![CDATA[Atque delectus consequatur quod tempore et est sapiente et quia odio possimus eius ut et similique vero ipsam velit debitis ipsa optio sequi aliquam eius dolorum aut autem error tenetur et mollitia excepturi nihil facilis tempora ipsum sunt dignissimos natus molestiae veritatis velit eaque impedit quibusdam nesciunt sunt non laborum eos est aliquam porro fuga omnis qui explicabo vero rerum debitis perferendis in ut quis quia eveniet cum et nisi eveniet et unde nesciunt ratione qui asperiores soluta voluptatem possimus et ratione eum et cupiditate asperiores voluptatem quam id corporis natus ut eligendi consequuntur vel sunt fugit temporibus dolor iusto cumque repudiandae illum fugiat dignissimos sapiente esse cumque commodi repellendus vel et officiis animi iusto aliquam officiis qui quos doloremque dicta ab quia debitis ut dolores eaque hic dolorum rerum ut esse odit quo quia dolorem facere non non dolorum qui excepturi voluptatem totam minus reprehenderit ipsa rem et et nihil sunt repellat quo voluptatibus impedit in quod quis et natus cum ea officia sed ratione explicabo id atque aliquid cumque est voluptatibus cupiditate unde natus quia ut voluptatibus et consectetur libero saepe numquam amet eligendi qui vero mollitia est exercitationem quas nihil quas nihil debitis laboriosam totam reiciendis aut.]]></description>
<price><![CDATA[331.69 EUR]]></price>
<url><![CDATA[https://example.com/product/7684]]></url>
<image_url><![CDATA[http://lorempixel.com/640/480]]></image_url>
<opening_times><![CDATA[{"1":[{"opening":"10:00","closing":"21:00"}],"2":[{"opening":"10:00","closing":"21:00"},{"opening":"10:00","closing":"21:00"}],"3":[{"opening":"10:00","closing":"21:00"}],"4":[{"opening":"10:00","closing":"21:00"}],"5":[{"opening":"10:00","closing":"21:00"}],"6":[{"opening":"10:00","closing":"21:00"}],"7":[{"opening":"11:00","closing":"20:00"}],"timezone":"Europe/Warsaw"}]]></opening_times>
</offer>
mój aktualny kod:
import fs from 'fs';
import sax from 'sax';
const strict: boolean = false;
const parser: sax.SAXParser = sax.parser(strict);
try {
const feedXMLReadStream: fs.ReadStream = fs.createReadStream('./Test xml/feed_sample.xml', {
encoding: 'utf-8',
});
const feedOutXMLWriteStream: fs.WriteStream = fs.createWriteStream('./feed_out.xml', {
encoding: 'utf-8',
});
var saxStream: sax.SAXStream = sax.createStream(strict, {
// trim: true,
lowercase: true,
});
saxStream.on("error", function (e) {
// unhandled errors will throw, since this is a proper node
// event emitter.
console.error("saxStream error!", e)
// clear the error
parser.resume();
});
saxStream.on("opentag", function (node) {
// same object as above
if (node.name === 'offer') {
console.log( node );
}
});
saxStream.on("data", function (text) {
// same object as above
console.log("text");
});
saxStream.on("closetag", function (node) {
// same object as above
if (node === 'offer') console.log("=================", node);
});
saxStream.on("end", () => {
console.log("done with saxStream");
});
feedXMLReadStream
.pipe(saxStream)
.pipe(feedOutXMLWriteStream);
console.log('------------------------------');
} catch (err) {
console.error('Error: \n', err);
}
czy ktoś potrafi mi podpowiedzieć jak 'chwycić' po kolei każdy węzeł <offer>?
Wczoraj cały dzień googlałem i nie udało mi się znaleźć interesujących mnie informacji.