C#使用XmlReader和XmlWriter解析XML

C#使用XmlReader和XmlWriter解析XML,c#,xml,C#,Xml,我正在解析此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_p

我正在解析此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>

您可以使用XPath表达式,仅选择“kod_waluty”与允许的货币列表匹配的节点,简而言之如下:

xmlDoc.SelectNodes("//pozycja[contains('THB', kod_waluty)]"))
如果你用这把小提琴,我相信你能使它适应你的需要! (链接于11月17日更新)

注意:该示例仅匹配一种货币,但您可以在如下列表中输入更多代码(XXX YYY ZZZ):

xmlDoc.SelectNodes("//pozycja[contains('THB XXX YYY ZZZ', kod_waluty)]"))

编辑:如果您确实喜欢示例中的流程,并且希望尽可能少地进行更改,而不是直接写入XmlWriter“writer”,您可以写入临时对象(可能是XmlNode?),然后验证货币后,您可以将临时对象写入“writer”,如果无效,则忽略它。

您可以使用XPath表达式,仅选择“kod_waluty”与允许的货币列表匹配的节点,简而言之如下:

xmlDoc.SelectNodes("//pozycja[contains('THB', kod_waluty)]"))
如果你用这把小提琴,我相信你能使它适应你的需要! (链接于11月17日更新)

注意:该示例仅匹配一种货币,但您可以在如下列表中输入更多代码(XXX YYY ZZZ):

xmlDoc.SelectNodes("//pozycja[contains('THB XXX YYY ZZZ', kod_waluty)]"))


编辑:如果您确实喜欢示例中的流程,并且希望尽可能少地进行更改,而不是直接写入XmlWriter“writer”,您可以写入临时对象(可能是XmlNode?),然后验证货币后,您可以将临时对象写入“writer”,或者忽略它,以防它无效。

xml文件中没有根元素吗?对不起,是的,我用完整的xml示例更新了原始帖子。@PavelMatras,使用XSLT可以更容易地实现您所需的功能。在大xml大小(比如数百兆字节)的情况下,使用流式XmlReader/XmlWriter是合理的。|在您的情况下,我将使用linq to xml:XDocument/XElement。xml文件中没有根元素吗?对不起,是的,我用完整的xml示例更新了原始帖子。@PavelMatras,使用XSLT可以更容易地实现您所需的功能。流式XmlReader/XmlWriter的使用在xml大小较大的情况下是合理的,例如,数百兆字节在您的例子中,我将使用linq to xml:XDocument/XElement.So解决方案是重写代码以使用XmlDocument。只有XmlReader和XmlWriter,我无法做到这一点?我想您需要XmlReader.ReadSubtree。这将给你一个其他的阅读器,你可以测试或货币,如果匹配,写出来。我已经玩了很长时间了。我尝试了XmlReader.ReadSubtree,它看起来不错,但是当我尝试处理这个由ReadSubtree创建的新实例(例如Read())时,XmlReader的原始实例也会受到影响-(@PavelMatras-没错。根据,
XmlReader
表示一个读卡器,它提供对XML数据的快速、非缓存、仅前向访问。因此,它不需要回顾以前的值,也不需要查看即将出现的值。如果文件很大,可以使用
XElement.ReadFrom
分块读取,如中所示。@PavelMatras如果您以后想使用XmlReader,那么从(过滤的)中创建XmlReader是没有问题的XmlDocument。有很多方法可以实现您想要的,在我看来,最好先去掉不需要的节点forst,然后开始迭代剩下的节点。所以解决方案是重写我的代码以使用XmlDocument。只有XmlReader和XmlWriter,我无法做到这一点?我想您需要XmlReader.ReadSubtree。这会给您带来很多好处如果你是另一个读者,你需要测试或货币,如果匹配,就写出来。我已经玩了很长时间了。我尝试了XmlReader.ReadSubtree,它看起来不错,但是当我尝试处理这个由ReadSubtree创建的新实例(例如Read())时,XmlReader的原始实例也会受到影响-(@PavelMatras-没错。根据,
XmlReader
表示一个读卡器,它提供对XML数据的快速、非缓存、仅前向访问。因此,它不需要回顾以前的值,也不需要查看即将出现的值。如果文件很大,可以使用
XElement.ReadFrom
分块读取,如中所示。@PavelMatras如果您以后想使用XmlReader,那么从(过滤的)XmlDocument创建XmlReader是没有问题的。有很多方法可以实现您想要的,在我看来,最好去掉不需要的节点forst,然后开始迭代剩下的节点。