C# 使用xmlreader和C将子项获取为字符串#

C# 使用xmlreader和C将子项获取为字符串#,c#,xml,parsing,xmlreader,C#,Xml,Parsing,Xmlreader,我在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 - m

我在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>
结果应该是(给定测试xml)

解析1的内容: 解析2标记存在 解析3的内容:一些文本 我也在尝试阅读子树


有什么提示吗?

基本上readinnerxml一直读到最后,而XmlReader只向前读。
您可以使用XmlDocument,或者另一种方法,从相同的Xml内容创建另一个读取器,读取到原始位置,获取字符串,并使用
XmlDocument
存储“副本”

您可以轻松地循环使用Xml元素并打印所需内容

例如:


在没有看到代码的情况下,很难找出问题所在。你能在你的问题中添加一些C来说明这个问题吗?好的,但问题不在于代码,而在于我要问的-基本上重复两次相同的节点-我将简短地添加代码示例如果我理解正确,
ReadSubtree
不会有帮助,当它将原始读取器放置在调用它的元素的末尾时。它真正做的只是提供一个“密封”的阅读器,它只看到那个元素。但我要补充一点,我真的不明白你想做什么。如果可能,请澄清您的问题。是的,我注意到-但我仍在尝试-基本上我需要获取节点parse1的innerxml或outterxml的内容,然后遍历它的子节点,但是如果我使用ReadInnerXml或ReadOutterXml,我就失去了可遍历性,如果我先遍历,我就失去了位置,不能使用ReadInnerXml或ReadOutterXml重新编辑我的代码示例和编辑的预期结果,以更好地说明我需要的内容,我将在明天查看xmldocument(这里几乎是一天结束时)。你的第二个建议基本上就是我今天想要达到的,但我能知道我在最初的建议中的位置吗?记住,我的例子很简单,我可以解析n个标记。只要读我自己的话,我就有了一个想法-一个标记计数器-然后跳过副本上的n个标记-明天就会尝试,除非那时有人想出更好的解决方案“基本上readinnerxml一直读到最后”-这就是我所看到的-虽然它只返回到另一种方法,即使用节点来构建Xpath表达式,但如果其中一些是集合,则Xpath的Position()函数将完成这项工作。NB XmlDocument加载整个文档,因此如果它很大,就要付出代价。您给我的想法(见我的第二条评论)奏效了-thamks a millionI曾尝试过这种方法,只是它不能处理更复杂的示例-例如,如果有2个parse1元素,只有一个有parse2元素,它将始终打印parse 2存在,我不知道它将驻留在哪个parse 1元素中。GetElementByTagName返回元素列表,如果“parse2”存在,您可以在打印之前检查元素父名称,或者检查“Parse1”是否有名为“Parse2”的子节点。另外,我建议您查看文档,我认为有很多方法对您有帮助,我会研究一下,以防万一-但正如我在Tony answer中所说的,我通过另一种方法解决了这个问题-不完美,但在初始测试中对我有效-对您的评论投了赞成票
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;
        }
    }
}
Contents of Parse 1: <parse2 /><negligeable />
Parse 2 tag exists
Contents of Parse 3: some text
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);