我正在解析來自第三方提供者的一些XML文件,但不幸的是,它並不總是格式良好的XML,因爲有時某些元素包含重複屬性。如何使用C刪除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提供程序有任何鉤子的情況下才允許你掛鉤處理並處理錯誤條件 – Ankur
有趣的問題,期待看到解決方案! –
使用XML將無法解決此問題,因爲您的輸入不是XML。你說你無法控制輸入,但是你至少可以讓你的上級知道你的供應商沒有給你發送XML嗎?你至少可以確保你的_vendor_知道這一點嗎?任何愚蠢地發送這些數據的組織都可能愚蠢到沒有意識到它不是XML。 –