サードパーティのプロバイダからXMLファイルを解析していますが、一部の要素に重複した属性が含まれているため、C#でXMLから重複する属性を削除する方法
私はソースを管理する権限がありません。どの要素に重複する属性があるのかわかりませんし、あらかじめ重複する属性名を知っているわけでもありません。
もちろん、XMLDocument
オブジェクトにコンテンツをロードすると、重複した上なXmlExceptionはので、私はしかし、私は要素によってXML要素もののステップと、私は問題のある要素を取得するとき、重複属性に対処するXmlReader
を使用することができます属性を提起します。
ただし、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();
}
入力を解析し、正規表現と文字列操作を使用せずに重複して属性を削除する別の方法があります:
ここで問題を実証するサンプル方法がありますか?
XMLプロセッサAPIプロバイダが処理に接続してエラー状態を処理できるようにするフックだけが可能です。 – Ankur
興味深い問題ですが、解決策を楽しみにしています! –
あなたの入力はXMLではないので、XMLを使ってこの問題を解決する方法はありません。あなたは入力を制御できないと言っていますが、ベンダがXMLを送信していないことを上司に少なくとも認識させることはできますか? _vendor_がこれを知っていることを少なくとも確認できますか?このデータを送信するのに十分な愚かな組織は、それがXMLではないことに気づかないほど愚かかもしれません。 –