从字符串中解析多个XML元素,其中一些元素可能不完整

时间:2014-03-25 19:13:23

标签: c# .net xml parsing xmldocument

我正在寻找一个方便的想要解析包含XML的字符串,但包含多个元素,其中一些元素可能不完整!要理解为什么我这样做,只是假设数据来自网络连接,并且在任何给定时间它可能都是不完整的,所以它看起来像这样:

这是一个元素:

"<note id='104'> <stuff> WEEE!</stuff> </note>"

以下是我收到的内容:

myString = "<note id='104'> <stuff> WEEE!</stuff>   </note> <note id"

请注意第二个(与第一个相同)是截止我想以一种非常简单的自动方式解析它,以便我可以阅读所有正确的并忽略所有不完整的。显而易见的方法是查找 note 和匹配 / note ,但这并不总是有效,因为行可以这样写,我不能只查找/&gt;因为那可能最终与其他东西相匹配......这就是它变得复杂的地方,因此我为什么要寻找或者自动为我做这件事!

我希望能够调用一些说

的功能
List<XmlDocument> xmlList = ExtractCompleteXMLDocsFromThisString(myString);

在上面的myString案例中,它将返回一个xmlDocument而不返回第二个不完整的一个。

更新:以下代码正在运行,但不是一种有效的方法。

        for ( int j = 0; j < myString.Length; j++ )
        {
            for ( int i = j; i < myString.Length+1; i++ )
            {
                string subString = string.Empty;
                try
                {
                    subString = myString.Substring(j, i);
                }
                catch(Exception e)
                {
                    Console.WriteLine("Can't Get SubString with j = " + j + " i = " + i + " myString.length = " + myString.Length);
                    Console.WriteLine(e.Message);
                    Console.WriteLine(e.StackTrace);
                }

                try
                {
                    XmlDocument subStringXML = new XmlDocument();
                    subStringXML.LoadXml(subString);
                    Console.WriteLine("Found a good one!");
                    // Extract good one
                    myString = myString.Remove(j, i);
                    Console.WriteLine(subString);
                    i -= subString.Length;
                }
                catch(Exception e)
                {
                    //                  Console.WriteLine("Can't parse:" + subString);
                }
            }
        }

更新2:尝试拆分技术,但找到了更好的方法,请参阅更新3。

更新3:XmlReader可以处理截断的文档!见下面的代码。唯一需要做的就是简单地处理异常。但它会在Xml有效的情况下解析出Xml,然后在没有的情况下对其进行异常处理。这非常适合我正在做的事情!谢谢。

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ConformanceLevel = ConformanceLevel.Fragment;
        using (XmlReader reader = XmlReader.Create(new StringReader(myString), settings))
        {
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    Console.WriteLine("reader.Name = " + reader.Name);
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

您没有提及您在实施中已尝试过的内容。我没有用你的例子测试过这个,但是XmlReader有点像使用SAX解析器,因此应该能够像这样处理截断的文档。我想到的是:

using (XmlReader reader = XmlReader.Create(new StringReader("..."))
{
   while (reader.Read())
   {
      if (reader.NodeType == XmlNodeType.Element)
      {
         ...
      }
   }
}