我正在解析来自第三方提供商的一些XML文件,不幸的是,有时一些元素包含重复属性,导致XML不是格式良好的。
我无法控制源,并且事先不知道哪些元素可能具有重复属性,也不知道重复属性名称。
显然,将内容加载到XMLDocument对象中会在重复属性上引发XmlException,因此我认为可以使用XmlReader逐个步进XML元素,并在到达有问题的元素时处理重复属性。
然而,在读取器读取(reader.Read())之前,XmlException就被引发了 - 我没有机会检查元素的属性。
以下是演示此问题的示例方法:
有没有其他方法可以解析输入并去除重复属性,而无需使用正则表达式和字符串操作?
我无法控制源,并且事先不知道哪些元素可能具有重复属性,也不知道重复属性名称。
显然,将内容加载到XMLDocument对象中会在重复属性上引发XmlException,因此我认为可以使用XmlReader逐个步进XML元素,并在到达有问题的元素时处理重复属性。
然而,在读取器读取(reader.Read())之前,XmlException就被引发了 - 我没有机会检查元素的属性。
以下是演示此问题的示例方法:
public static void ParseTest()
{
const string xmlString =
@"<?xml version='1.0'?>
<!-- This is a sample XML document -->
<Items dupattr=""10"" id=""20"" dupattr=""33"">
<Item>test with a child element <more/> stuff</Item>
</Items>";
var output = new StringBuilder();
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
XmlWriterSettings ws = new XmlWriterSettings();
ws.Indent = true;
using (XmlWriter writer = XmlWriter.Create(output, ws))
{
while (reader.Read()) /* Exception throw here when Items element encountered */
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
writer.WriteStartElement(reader.Name);
if (reader.HasAttributes){ /* CopyNonDuplicateAttributes(); */}
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
break;
case XmlNodeType.Comment:
writer.WriteComment(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
}
}
}
}
string str = output.ToString();
}
有没有其他方法可以解析输入并去除重复属性,而无需使用正则表达式和字符串操作?
<e a="1" a="2"/>
,这不是XML。 - John Saunders