我正在寻找一个方便的想要解析包含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);
}
}
}
答案 0 :(得分:1)
您没有提及您在实施中已尝试过的内容。我没有用你的例子测试过这个,但是XmlReader有点像使用SAX解析器,因此应该能够像这样处理截断的文档。我想到的是:
using (XmlReader reader = XmlReader.Create(new StringReader("..."))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
...
}
}
}