【问题标题】:Parse multiple XML elements from string, when some of which may be incomplete从字符串中解析多个 XML 元素,其中一些元素可能不完整
【发布时间】:2014-03-25 19:13:22
【问题描述】:

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

这是一个单一的元素:

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

这是我收到的:

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

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

我很想能够调用一些功能,说

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);
                }
            }
        }

【问题讨论】:

  • 你能在 上做一个拆分吗?这应该创建一个字符串数组,其中包含注释的所有 xml。您唯一应该担心的是最后一个。
  • 解析不完整的文档有什么意义?它不会包含完整的数据集。您想如何处理一组不完整的数据?
  • 认为他说他可以将“坏”案例嵌套在“好”案例周围(不一定在最后)。我不知道你是怎么把自己放在那种情况下的
  • 正确,我想忽略“坏”的情况。我有一个带有异步连接的 iOS 应用程序正在接收数据。我正在对其进行压力测试,看看我会遇到哪些奇怪的情况,比如数据乱序、中断等......

标签: c# .net xml parsing xmldocument


【解决方案1】:

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

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

【讨论】:

  • 我在 reader.Read() 上收到异常“检测到多个文档元素”。我现在正在想办法解决这个问题……我会告诉你进展如何
  • 你是对的,请参阅上面的更新 3,了解如何处理截断的文档。
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多