使用xmlreader和C#将Children作为字符串

本文关键字:字符串 Children xmlreader 使用 | 更新日期: 2023-09-27 18:20:03

我在c#中使用xmlreader解析xml字符串,但在解析时,有时我需要获得节点的全部内容,包括带有标记的子节点,并且仍然能够继续解析。

ReadInnerXML和ReadOutterXML为我分解了

示例XML:

<?xml version="1.0" standalone="yes"?>
<main>
    <parse1> //finding this will get full inner or outter xml - either one - my issue
         <parse2 /> // even getting the children above might still need parse chldren
         <negligeable /> // not all children interest me
   </parse1>
   <parse3>some text</parse3> // not all children of main are the same but all need be parsed
</main>

希望这能让你大致了解我需要什么

我现在可以解析2和3,并忽略我不需要的内容,但如果我在找到标记时使用ReadInnerXML或ReadOutterXML,它将不允许我解析任何其他内容,甚至不允许我分析外部的标记。

ReadInnerXML和ReadOutterXML确实正确地返回了我需要的文本,但导致其他所有内容都无法解析

编辑:根据blinkenlight建议,部分代码:

using (XmlReader reader = XmlReader.Create(new StringReader(XmlString)))
{
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
                switch (reader.Name)
                {
                    case "parse1":
                         Console.WriteLine("Contents of Parse 1: {0}", ?function here?);
                         break;
                    case "parse2":
                         Console.WriteLine("Parse 2 tag exists");
                         break;
                    case "parse3":
                         Console.WriteLine("Contents of Parse 3: {0}", Reader.ReadElementContentAsString());
                         break;
                }
                break;
        }
    }
}

结果应该是(给定测试xml)

Contents of Parse 1: <parse2 /><negligeable />
Parse 2 tag exists
Contents of Parse 3: some text

我也在尝试ReadSubTree

有什么提示吗?

使用xmlreader和C#将Children作为字符串

基本上readinnerxml一直读到最后,XmlReader只向前。您可以使用XmlDocument,或者用另一种方法,从相同的Xml内容创建另一个读取器,读取到原始文件中的位置,获取字符串并将"副本"放入bin中

使用XmlDocument,您可以轻松地循环浏览xml元素并打印您想要的

例如:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(XmlString);
string parse1_Content = xmlDocument.GetElementsByTagName("parse1")[0].InnerXml;
Console.WriteLine("Contents of Parse 1: " + parse1_Content);
if(xmlDocument.GetElementsByTagName("parse2") > 0)
    Console.WriteLine("Parse 2 exists");
string parse3_Content = xmlDocument.GetElementsByTagName("parse1")[0].InnerText;
Console.WriteLine(parse3_Content);