2009-09-14 31 views
9

Có công cụ nào có thể định dạng tập tin XML định dạng (in đẹp) cũng như sắp xếp cả các phần tử và thuộc tính của nó?Công cụ phân loại/định dạng XML

+0

trùng lặp: https://stackoverflow.com/q/9161934/492 .. nhưng câu trả lời ở đây là hữu ích hơn cho tôi –

Trả lời

3

Tôi đã tìm thấy bài đăng này: http://www.biglist.com/lists/xsl-list/archives/200106/msg01225.html sử dụng XSLT sau để XML thụt lề và cũng loại thuộc tính:

<?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> 

Tôi đã không thử nó chưa, nhưng nhiều khả năng tôi sẽ dính vào XSLT để làm định dạng nhất cho tôi.

+0

này là rất tốt để thứ tự xml thuộc tính, làm thế nào tôi cũng có thể đặt hàng con của một thẻ? – Natim

7

Tôi đang tìm kiếm một tiện ích tương tự và không thực sự tìm thấy những gì tôi đang tìm kiếm, vì vậy tôi chỉ vừa mới viết một thay thế. Nó rất đơn giản (và không bao gồm các thuộc tính trong phân loại nút), nhưng hoạt động.

Có thể nó sẽ hữu ích cho người khác .. Đó là trên GitHub.

Dưới đây là một chút từ trang 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.) 

Mặc định là đầu ra các nút và các thuộc tính khá và được sắp xếp. Dưới đây là một ví dụ:

> 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

tôi thích công cụ này: https://xmlsorter.codeplex.com/

Bạn có thể sắp xếp theo tên thẻ và các thuộc tính. Tôi thích sử dụng nó trước khi so sánh một số tệp XML.

XML Sorter main window

+0

Điều này thậm chí sẽ không tải tệp XML. Có lỗi "XML không hợp lệ". Không thể xử lý thẻ doctype. Sau khi gỡ bỏ nó làm việc. – ScrappyDev

+0

Điều này làm việc cho tôi để kiểm tra nhanh chóng một cặp tệp với hơn 7K dòng và có cấu trúc xml bán phức tạp, vì vậy ban đầu tôi rất ấn tượng. Không có lỗi nào cả. Tải xuống, khởi chạy và thực thi trơn tru/nhanh chóng. Một điều cần lưu ý là nó cho phép "sắp xếp thuộc tính" và "sắp xếp các thuộc tính cụ thể" và nơi bạn chọn những thuộc tính bạn muốn. Bạn có thể kiểm tra cả hai tùy chọn có vẻ chồng chéo. –

+0

Đó là "Sắp xếp thuộc tính" và "Sắp xếp * theo * thuộc tính cụ thể", rất khác nhau. Các đơn đặt hàng đầu tiên các thuộc tính cho mỗi dòng, thứ hai sắp xếp tất cả các dòng theo nội dung của một thuộc tính cụ thể. Sau này là rất thực tế tôi nghĩ. – Gertsen

2

Out of thất vọng với Visual Studio mà dường như để sắp xếp lại & viết lại EDMX-files (Entity Framework) tất cả các thời gian (xem thêm Uservoice này), tôi đã viết một số LINQPad mã để sắp xếp lại thứ. Đó là tuy nhiên dễ dàng (và rõ ràng) để sử dụng bên ngoài của LinqPad.

Đơn đặt hàng các phần tử theo loại phần tử (thẻ), sau đó theo giá trị của thuộc tính phần tử "Tên", và sau đó là một số nội dung khác để cố gắng biến nó thành định nghĩa (xml khác nhau, nhưng ý nghĩa tương tự , là [thường] cùng một đầu ra - xem mã).

Nó cũng sắp xếp các thuộc tính. Lưu ý rằng ngữ nghĩa XML thuộc tính có thể không có (có liên quan) theo thứ tự, nhưng textually họ làm, và hệ thống kiểm soát phiên bản vẫn coi chúng plain text ...

(Lưu ý rằng nó không sửa chữa các bí danh khác nhau, được đề cập trong Entity Framework edmx file regenerating differently amongst team)

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: Chúng tôi đã kết thúc bằng XSLT mà người khác đã viết cùng một lúc. Tôi nghĩ rằng nó được trang bị dễ dàng hơn/tốt hơn trong quá trình xây dựng của mọi người. Nhưng có lẽ/hy vọng đây là một số sử dụng cho ai đó.

+0

Bạn đã sử dụng xslt nào? –

+0

uh, hãy xem cái này - nó cắt các giá trị từ các nút như ' giá trị' –

0

Tôi đã vượt qua bài đăng này khi cố gắng tìm ra cách sắp xếp và tệp edmx. Giải pháp của tôi được dựa trên các giải pháp Arvo Bowens tìm thấy 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)); 
    } 
} 
Các vấn đề liên quan