[英]How can I add ISortedEnumerable<XElement> to XElement?
[英]How can I add an XElement child based on XSD validation rules?
我想將XElement
子項添加到父XElement
實例。 但是,我希望子元素的位置符合給定XSD中指定的規則。 具體來說,我希望子元素符合<xs:sequence>
規則。 不過,如果我能找到一個考慮到任何XSD規則的解決方案,那就太好了。
這可能嗎? 我最初的想法是遍歷已經存在的每個子元素,然后嘗試添加新元素,然后驗證XDocument
,並在循環中繼續進行此操作,直到沒有驗證錯誤為止。 但是有更好的方法嗎?
更新資料
我有一個XML文件,該文件已創建並針對XSD架構進行了驗證(來自第3方,相當復雜)。
將XML文件加載為XDocument
對象后,我的代碼的一部分找到了需要將新XElement
實例添加到父XElement
對象的位置。 無需過多介紹其工作原理,在此我簡化了概念:
XDocument doc = XDocument.Load(@"path\to\file.xml");
XElement parent = GetElementToAppend(doc);
XElement newElement = new XElement("NewElement",
new XAttribute("RequiredAttribute", "value"));
parent.Add(newElement);
但是,我不僅需要簡單地使用Add方法,還需要一種將新XElement
插入有效位置的方法。 由於我要添加到完整的XML文檔中,因此父級可能已經具有許多其他子元素。 因此,我需要一種方法來查找第一個子元素,在該子元素中執行以下代碼不會導致XDocument
架構驗證失敗:
XElement childElement = FindChildToAdd(parent, newElement);
childElement.AddAfterSelf(newElement);
我考慮過使用此線程中所述的XmlSchemaValidator
類的GetExpectedParticles
方法,但是實現似乎非常復雜。
我還考慮過執行以下類似操作以在XML中找到有效位置:
foreach (XElement el in parent.Elements()) {
bool errors = false;
el.AddAfterSelf(newElement);
newElement.Validate(schemas, (o, e) => { errors = true; });
if (!errors)
break;
newElement.Remove();
}
但這似乎效率極低。
一些上下文將是有用的。 什么是“ XElement”?
但是,我希望子元素的位置符合給定XSD中指定的規則。 具體來說,我希望子元素遵循規則。 不過,如果我能找到一個考慮到任何XSD規則的解決方案,那就太好了。
請提供您要考慮的“規則”示例。
您似乎正在處理一個非常不受約束的模型。 大多數XML應用程序都可以對將要處理的XML文檔的類型做出一些假設(除非它們僅需要根據提供的模式進行驗證而又不了解文檔的內容)。
您的申請似乎處在不幸的位置
a)您事先不知道XSD,並且
b)您需要以與XSD一致的方式來編輯XML文檔
我能問一下您的應用程序實際上在試圖做什么(除非該信息具有商業敏感性-不要讓自己被開除我的帳戶)?
如果您確實需要執行此操作,那么我認為GetExpectedParticles路由是唯一的選擇。 但是不要低估其中的復雜性-這是一個真正困難的問題,我懷疑這可能不是您真正需要解決的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.