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

时间:2012-01-12 15:23:44

标签: 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 - 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确实返回我需要的文本,但导致其他所有内容都无法解析

编辑:根据dasblinkenlight sugestion,一些代码:

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

任何提示?

2 个答案:

答案 0 :(得分:1)

基本上,readinnerxml一直读到最后,而XmlReader只是前传。 您可能会使用XmlDocument,或者其他方式,使用相同的Xml内容创建另一个阅读器,读取您在原始位置的位置,获取您的字符串并装入“副本”

答案 1 :(得分:1)

使用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);