【发布时间】:2020-11-17 21:54:56
【问题描述】:
我正在解析这个 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>
我正在使用 XmlReader 从 URL 读取它并使用 XmlWriter 将其写入我的 XML 文件。但我也有允许的货币列表,所以我不想将所有货币从 URL XML 写入我的 XML 文件。
但是,当我开始编写 section 时,如何有效地测试货币是否在我的列表中,但只有当我到达
这是我当前的代码,它在没有任何条件的情况下读取所有货币:
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();
}
【问题讨论】:
-
xml文件中没有根元素吗?
-
对不起,是的,我更新了原始帖子,带有完整的 XML 示例。
-
@PavelMatras,使用 XSLT 更容易实现您的需求。
-
在大型 xml 大小(例如数百兆字节)的情况下,使用流式 XmlReader/XmlWriter 是合理的。 |在你的情况下,我会使用 linq to xml: XDocument/XElement.