3

我试图为我的问题找到解决方案,但我在这方面的知识(Linq、XML)相当有限。:( '已经找到了一个类似的结构,但我需要一种更复杂的排序方式。

考虑以下 XML 文档:

<Envelope>
    <Body>
        <Table>
            <Trans>
                <B>1</B>
                <A>3</A>
                <C>5</C>
            </Trans>
            <Trans>
                <D>1</D>
                <A>6</A>
                <C>3</C>
            </Trans>
            <Trans>
                <A>1</A>
                <C>3</C>
                <B>5</B>
            </Trans>
        </Table>
    </Body>
<Envelope>

有什么方法可以使用 C#/Linq 对 <Trans> 中的元素进行排序,还是必须分解所有 <Trans> 元素并一一排序?

更新 我有一个文件,这就是我想要完成的。;)

<Envelope>
    <Body>
       <Table>
           <Trans>
               <A>3</A>
               <B>1</B>
               <C>5</C>
           </Trans>
           <Trans>
               <A>6</A>
               <C>3</C>
               <D>1</D>
           </Trans>
           <Trans>
               <A>1</A>
               <B>5</B>
               <C>3</C>
           </Trans>
       </Table>
   </Body>
<Envelope>
4

2 回答 2

3

这实际上取决于您到底想要做什么(按顺序处理它们,还是重新排序 XML?)以及您的“排序”到底是什么意思(按标签名称排序?按值排序?)。

如果您只想按顺序处理它们,这就是您可以<Trans>按值(<D>1</D>之前<A>6</A>)对每个元素中的所有元素进行排序的方法:

XDocument doc = /* load up your XML */

var sorted = from trans in doc.Descendants("Trans")
             select trans.Children().OrderBy(c => int.Parse(c.Value)).ToArray();

或者,这是按标签名称(<A>6</A>之前<D>1</D>)排序的方法:

var sorted = from trans in doc.Descendants("Trans")
             select trans.Children().OrderBy(c => c.Name.LocalName).ToArray();

有了上面,sorted将是一个可枚举的数组集合。集合中的每个数组都代表一个<Trans>,每个这样的数组都<Trans>按顺序保存 的子级。

于 2012-06-20T10:05:56.463 回答
2
XDocument xDoc = XDocument.Load(....);
foreach(var trans in xDoc.Descendants("Trans"))
{
    trans.ReplaceAll( trans.Elements().OrderBy(x=>x.Name.LocalName));
}

string newXml = xDoc.ToString();
于 2012-06-20T10:08:46.740 回答