2009-09-14 39 views
9

XMLファイルの書式設定(かなり印刷)とその要素と属性の並べ替えを行うツールはありますか?XML並べ替え/書式設定ツール

+0

重複:https://stackoverflow.com/q/9161934/492 ..しかし、答えはここにこれはに素晴らしいです私 –

答えて

3

私はこの記事を見つけた:http://www.biglist.com/lists/xsl-list/archives/200106/msg01225.html XMLをインデントするには、以下のXSLTを使用し、また、ソート属性のこと:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:copy> 
     <!-- Sort the attributes by name. --> 
     <xsl:for-each select="@*"> 
     <xsl:sort select="name(.)"/> 
     <xsl:copy/> 
     </xsl:for-each> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="text()|comment()|processing-instruction()"> 
    <xsl:copy/> 
    </xsl:template> 

</xsl:stylesheet> 

私はまだそれを試してみましたが、最も可能性が高いしていない私は書式設定を行うにXSLTに固執します私のために。

+0

にとってより有用でしたorder xml属性、タグの子をどのように注文できますか? – Natim

7

私は同じようなユーティリティを探していましたが、探していたものは実際に見つからなかったので、代わりにほとんど書きませんでした。これは非常に簡単です(ノードソートの属性は含まれません)。

多分、他の人には役に立ちます。それはGitHubです。ここで

は、GitHubのページからのビットは、デフォルトの出力にきれいでソートされたノードと属性です...

USAGE: sortxml.exe [options] infile [outfile] 

    infile  The name of the file to sort, etc. 
    outfile  The name of the file to save the output to. 
       If this is omitted, then the output is written to stdout. 

OPTIONS: 

    --pretty Ignores the input formatting and makes the output look nice. 
    --sort  Sort both the nodes and attributes. 
    --sortnode Sort the nodes. 
    --sortattr Sort the attributes. 

(prefix an option with ! to turn it off.) 

です。次に例を示します。

> type sample.xml 
<?xml version="1.0" encoding="utf-8" ?><root><node value="one" attr="name"/></root> 

> sortxml.exe sample.xml 
<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <node attr="name" value="one" /> 
</root> 
10

私は、このツールを気に入っ:https://xmlsorter.codeplex.com/

あなたがタグ名と属性で並べ替えることができます。私はいくつかのXMLファイルを比較する前にそれを使用するのが好きです。

XML Sorter main window

+0

これはXMLファイルをロードしないでしょう。 「無効なXML」エラーが表示されます。 doctypeタグを処理できませんでした。一度それを取り除いた。 – ScrappyDev

+0

これは私のために、7K行以上のファイルと、半複雑なxml構造を持つファイルのペアを簡単にテストするために働いていたので、私は当初感銘を受けました。エラーは一切ありません。スムーズ/クイックダウンロード、起動、実行。注目すべき点の1つは、「ソート属性」と「特定のソート属性」を許可し、必要なものを選択できることです。重複して見える両方のオプションをチェックすることができます。 –

+0

「属性の並べ替え」と「*特定の属性による並べ替え」は非常に異なります。 1行目は各行の属性を順序付けし、2行目はすべての行を特定の属性の内容で並べ替えます。後者はとても実用的だと思います。 – Gertsen

2

&書き換えEDMX-ファイル(Entity Frameworkの)すべての時間を並べ替えるように見えるのVisual Studioでのフラストレーションから(このUservoiceを参照してください)、私はものの順序を変更するために、いくつかのLinqpadコードを書きました。しかし、LinqPadの外で使うのは簡単です(明らかです)。

要素タイプ(タグ)、次に要素属性 "名前"の値順に要素を並べ替え、次に決定的な(異なるxmlでも同じ意味、[通常は同じ出力 - コード参照)です。

また、属性を注文します。 意味的 XML-属性はなし(関連する)順番を持たない場合がありますが、テキストで彼らは、およびバージョン管理システムは、まだ彼らにプレーンテキストを検討...

(それは別のエイリアスを解決しないことに注意してください、

void Main() 
{ 
    XDocument xdoc = XDocument.Load(@"\\filepath1\file1.edmx"); 

    var orderedElements = CopyAndSortElements(xdoc.Elements()); 

    var newDoc = new XDocument(); 
    newDoc.Add(orderedElements); 
    newDoc.Save(@"\\filepath1\file1.Ordered.edmx"); 
} 

public IEnumerable<XElement> CopyAndSortElements(IEnumerable<XElement> elements) 
{ 
    var newElements = new List<XElement>(); 
    // Sort XElements by Tag & name-attribute (and some other properties) 
    var orderedElements = elements.OrderBy(elem => elem.Name.LocalName) // element-tag 
            .ThenByDescending(elem => elem.Attributes("Name").Count()) // can be 0, more than 1 is invalid XML 
            .ThenBy(elem => (elem.Attributes("Name").Any() ? elem.Attributes("Name").First().Value.ToString() : string.Empty)) 
            // in case of no Name-Attributes, try to sort by (number of) children 
            .ThenBy(elem => elem.Elements().Count()) 
            .ThenBy(elem => elem.Attributes().Count()) 
            // next line may vary for textually different but semantically equal input when elem & attr were unordered on input, but I need to restrain myself... 
            .ThenBy(elem => elem.ToString()); 
    foreach (var oldElement in orderedElements) 
    { 
     var newElement = new XElement(oldElement.Name); 
     var orderedAttrs = oldElement.Attributes().OrderBy(attr => attr.Name.LocalName).ThenBy(attr => attr.Value.ToString()); 
     newElement.Add(orderedAttrs); 
     newElement.Add(CopyAndSortElements(oldElement.Elements())); 
     newElements.Add(newElement); 
    } 
    return newElements; 
} 

PS)Entity Framework edmx file regenerating differently amongst teamで述べた:我々は、他の同じ時刻に書いた誰かXSLTを使用して終了。私はそれがすべてのビルドプロセスでより簡単に/より良くフィットすると思います。 しかし多分/これは誰かに何らかの役に立つことだと思う。

+0

どのようなxsltを使用して終了しましたか? –

+0

uh、これを見てください。それは 'の値'のようなノードから値を削除します。 –

0

どのようにソートしてedmxファイルを見つけようとしたとき、私はこの記事全体を見に来ました。 アルヴォBowensのソリューションに基づいていた私の解決策が見つかりました。 https://stackoverflow.com/a/19324438/212241

void Main() 
{ 
    XDocument xdoc = XDocument.Load(@"C:\git\Nvision\Source\NvisionEntities\NvisionModel.edmx"); 
    Sort(xdoc.Root); 
    xdoc.Save(@"C:\git\Nvision\Source\NvisionEntities\NvisionModel.edmx"); 
} 

public void Sort(XElement source, bool bSortAttributes = true) 
{ 
    //Make sure there is a valid source 
    if (source == null) throw new ArgumentNullException("source"); 

    //Sort attributes if needed 
    if (bSortAttributes) 
    { 
     List<XAttribute> sortedAttributes = source.Attributes().OrderBy(a => a.ToString()).ToList(); 
     sortedAttributes.ForEach(a => a.Remove()); 
     sortedAttributes.ForEach(a => source.Add(a)); 
    } 

    //Sort the children IF any exist 
    List<XElement> sortedChildren = source.Elements().OrderBy(elem => elem.Attributes("Name").Any() ? elem.Attributes("Name").First().Value.ToString() : string.Empty).ToList(); 
    if (source.HasElements) 
    { 
     source.RemoveNodes(); 
     sortedChildren.ForEach(c => Sort(c)); 
     sortedChildren.ForEach(c => source.Add(c)); 
    } 
} 
関連する問題