[英]Can you change an XML to fit an XSD with LINQ?
我有一個XML,需要對其元素進行重新排列。 有沒有辦法使用LINQ做到這一點?
如下面的示例所示,元素3和2混合在一起,需要重新排列,因此元素分別為1,2和3。下一次輸入數據的順序可能甚至會有所不同,但是需要放回去到1,2和3。
<a>
<1></1>
<3></3>
<2></2>
</a>
最困難的部分是從XSD獲取正確的命令。 您可以將XSD加載為XDocument
並直接使用XML查詢。
考慮根據你的榜樣下面的架構(我加了下划線,因為1
, 2
,和3
是不合法的XML名稱本身)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
targetNamespace="http://tempuri.org/XMLSchema1.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema1.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="a">
<xs:sequence>
<xs:element name="_1" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="_2" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="_3" type="xs:string" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:schema> `
如果將其加載到對象中(最好是XDocument
或XElement
),則可以在架構上執行LINQ查詢(該查詢未經過測試,我從上次執行此操作就從內存中執行此操作,但是如果丟失了東西,它應該指出正確的方向)
var schema = XDocument.Load(@"C:\somepath\XMLSchema1.xsd");
var xs = XNamespace.Get(@"http://www.w3.org/2001/XMLSchema");
var order = (from x in schema.Elements(xs + "schema").Elements(xs + "complexType")
where x.Attributes("name").FirstOrDefault().Value == "a"
select x.Element(xs + "sequence").Elements())
.First()
.Select(x => x.Attribute("name").Value);
如果您具有更復雜的XSD,並且具有預定義的類型和/或自定義名稱空間,則它將使查詢使元素的順序更復雜,但是希望您可以理解。 如果您有一個非常復雜的XSD,請參閱本答案末尾的一些鏈接,以幫助您了解XmlSchemaInfo
對象模型,並且您也許可以編寫自己的查詢來更輕松地獲得訂單。
一旦您擁有正確的順序,我不建議您使用LINQ來實際更改節點的順序,因為LINQ並非旨在修改對象,而是使用它來查找節點和父節點,然后按順序重新排列它們你要。
XElement xelem = // get parent element of the elements you need to rearrange
foreach (var element in order)
{
var node = xelem.Element(element);
node.Remove();
xelem.Add(node);
}
如果您打算經常使用代碼直接訪問XSD,我建議閱讀以下問題和解答以尋求幫助,因為XmlSchemaInfo
對象模型的文檔XmlSchemaInfo
,並且將花費一些時間和精力來獲取可行的方法來提取內容。你需要。 從架構中查找和提取所需的信息將更加容易。
從XML文件推斷出的XmlSchema-如何遍歷XSD中的所有元素? (他在評論中提到的莫拉夫斯基的問題)
驗證XDocument時捕獲架構信息 (我自己的問題和答案)
http://geekswithblogs.net/.NETonMyMind/archive/2006/05/02/76957.aspx (很棒的博客文章,我從那里獲得有關SchemaInfo問題和解答的大部分信息)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.