繁体   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