【发布时间】:2011-09-30 09:12:55
【问题描述】:
我正在解析来自第三方提供商的一些 XML 文件,不幸的是它并不总是格式良好的 XML,因为有时某些元素包含重复的属性。
我无法控制来源,我不知道哪些元素可能有重复的属性,也不知道重复的属性名称。
显然,将内容加载到 XMLDocument 对象会在重复属性上引发 XmlException,因此我可以使用 XmlReader 逐个元素地遍历 XML 元素并在到达违规元素。
但是,XmlException 是在 reader.Read() 上引发的 - 在我有机会检查元素的属性之前。
这是一个演示问题的示例方法:
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();
}
是否有另一种方法来解析输入并删除重复的属性,而无需使用正则表达式和字符串操作?
【问题讨论】:
-
只有在 XML 处理器 API 提供任何允许您挂钩处理并处理错误情况的挂钩时才有可能
-
有趣的问题,期待看到解决方案!
-
我想你的问题已经在这里得到了回答:stackoverflow.com/questions/4085065/…
-
使用 XML 将无法解决此问题,因为您的输入不是 XML。您说您无法控制输入,但您能否至少让您的上级意识到您的供应商没有向您发送 XML?你至少能确保你的vendor知道这一点吗?任何愚蠢到发送这些数据的组织都可能愚蠢到没有意识到它不是 XML。
-
-1:不,这个问题是关于根据属性值删除彼此重复的元素。这个问题是关于具有相同属性的多个副本的“元素”,例如
<e a="1" a="2"/>,它不是 XML。
标签: c# xml validation html-agility-pack