I am parsing this XML:
<?xml version="1.0" encoding="ISO-8859-2"?>
<tabela_kursow typ="A" uid="20a219">
<numer_tabeli>219/A/NBP/2020</numer_tabeli>
<data_publikacji>2020-11-09</data_publikacji>
<pozycja>
<nazwa_waluty>bat (Tajlandia)</nazwa_waluty>
<przelicznik>1</przelicznik>
<kod_waluty>THB</kod_waluty>
<kurs_sredni>0,1236</kurs_sredni>
</pozycja>
<pozycja>
<nazwa_waluty>dolar amerykanski</nazwa_waluty>
<przelicznik>1</przelicznik>
<kod_waluty>USD</kod_waluty>
<kurs_sredni>3,7787</kurs_sredni>
</pozycja>
</tabela_kursow>
I am reading it with XmlReader from URL and writing with XmlWriter to my XML file. But I also have list of permitted currencies, so I don't want to write all currencies from URL XML to my XML file. But how can I effectively test if currency is on my list, when I start writing section , but only when I reach <kod_waluty> tag I can test if I want this currency or not. Can I previous lines write somewhere to buffer and later decide if I want them or not?
This is my current code which is reading all currencies without any conditon:
public void ApiCall()
{
bool today = false;
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Tools.Log("Start processing file: " + cf.rateUrl);
XmlWriter writer = XmlWriter.Create(cf.outXml);
writer.WriteStartDocument();
//*** FOR TESTS ***
using (XmlReader reader = XmlReader.Create(new StreamReader("LastA.xml", Encoding.GetEncoding(28592))))
//*** FOR TESTS ***
//using (XmlReader reader = XmlReader.Create(new StreamReader(WebRequest.Create(cf.rateUrl).GetResponse().GetResponseStream(), Encoding.GetEncoding(28592))))
{
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (reader.Name.Equals("data_publikacji"))
{
today = true;
}
writer.WriteStartElement(reader.Name);
while (reader.MoveToNextAttribute())
{
writer.WriteAttributeString(reader.Name, reader.Value);
}
break;
case XmlNodeType.Text:
writer.WriteNode(reader, true);
writer.WriteEndElement();
if (today)
{
writer.WriteStartElement("our_date");
var settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
StringReader scontent = new StringReader(string.Format(cf.today.Year + "-" + cf.today.Month + "-" + cf.today.Day));
XmlReader ourDate = XmlReader.Create(scontent, settings);
writer.WriteNode(ourDate, true);
writer.WriteEndElement();
today = false;
}
break;
case XmlNodeType.EndElement:
writer.WriteNode(reader, false);
break;
}
}
}
writer.WriteEndDocument();
writer.Close();
}