【发布时间】: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