簡體   English   中英

您可以更改XML以使其適合LINQ的XSD嗎?

[英]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查詢。

考慮根據你的榜樣下面的架構(我加了下划線,因為12 ,和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>    `

如果將其加載到對象中(最好是XDocumentXElement ),則可以在架構上執行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時捕獲架構信息 (我自己的問題和答案)

在C#中,如何確定元素的XSD定義的MaxLength

http://geekswithblogs.net/.NETonMyMind/archive/2006/05/02/76957.aspx (很棒的博客文章,我從那里獲得有關SchemaInfo問題和解答的大部分信息)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM