2008-12-16 31 views
10

Tôi đã tìm kiếm một thành phần cho phép tôi chuyển đối tượng C# tùy ý sang biến đổi XSL.Duyệt qua biểu đồ đối tượng C# tùy ý bằng cách sử dụng XPath/áp dụng phép biến đổi XSL

Cách ngây thơ của việc này là nối tiếp đồ thị đối tượng bằng cách sử dụng XmlSerializer; tuy nhiên, nếu bạn có đồ thị đối tượng lớn, điều này có thể gây ra các vấn đề liên quan đến hiệu suất. Các vấn đề như tham chiếu vòng tròn, tải chậm, proxy ... có thể làm ngập nước nhiều hơn tại đây.

Cách tiếp cận tốt hơn là có một loại lớp Bộ điều hợp thực hiện IXPathNavigable và XPathNavigator. Một ví dụ mà tôi đã gặp phải là ObjectXPathNavigator from Byte-Force - tuy nhiên, hầu hết tài liệu chính của nó là bằng tiếng Nga và các thử nghiệm ban đầu của tôi dường như chỉ ra rằng nó có một số điểm kỳ quặc và tính đồng nhất.

Có ai biết (a) mọi tài nguyên (tổng quan, hướng dẫn, bài đăng trên blog v.v.) về điều này cụ thể trong tiếng Anh hoặc (b) bất kỳ lựa chọn thay thế nào khác cung cấp chức năng giống hoặc tương tự không?

+0

@jammycakes: Sẽ chỉ là "Vượt qua một đồ thị với XSLT" là một câu trả lời hữu ích đối với bạn? Nếu có, tôi sẽ mở rộng trên đó. –

Trả lời

2

Nghe có vẻ như vấn đề bạn đang cố giải quyết khá thú vị. Ở cái nhìn đầu tiên, tôi khuyên bạn nên viết bản thực hiện của riêng bạn về con cháu XPathNavigator - chỉ có 20 phương thức lẻ để viết, và không có phương pháp nào có chữ ký đặc biệt khó.

Thực hiện ngây thơ sử dụng phản chiếu không được lưu trữ sẽ chậm (ish) nhưng sẽ hoạt động tốt như một bằng chứng về khái niệm và bạn có thể thực hiện thay đổi để cải thiện hiệu suất nếu/khi điều đó trở thành vấn đề.

Tuy nhiên ...

... Tôi nghĩ bạn có thể gặp phải một số khó khăn bắt nguồn từ cách tiếp cận của bạn, không phải từ bất kỳ chi tiết triển khai nào.

Một tệp XML (theo bản chất) là một hệ thống phân cấp đơn giản của các phần tử và thuộc tính - không có vòng lặp (hay còn gọi là chu kỳ) trong biểu đồ nút.

Biểu thức XPath có thể bao gồm toán tử "//" có nghĩa là tìm kiếm chiều sâu không giới hạn. (Để biết định nghĩa chính xác, xem phần 2.5 của XPath 1.0.)

Nếu bạn áp dụng biểu thức đó cho đồ thị đối tượng có tham chiếu chéo (còn gọi là chu kỳ đối tượng), thì bạn sẽ gặp rủi ro của bộ đánh giá XPath đi vào vòng lặp vô hạn vì nó đã cố gắng đệ quy liệt kê một đồ thị vô hạn hiệu quả.

Bạn có thể khắc phục sự cố này bằng cách nào đó theo dõi các nút cha trong số XPathNavigator và ném ngoại lệ nếu phát hiện thấy vòng lặp, nhưng tôi không chắc chắn về khả năng này.

+0

Xem câu trả lời của tôi cho Adam Hawkes. Như tôi đã lưu ý, đây thực sự là một vấn đề được giải quyết - câu hỏi của tôi là nó đã được ghi lại không đúng, và có ai biết về bất kỳ tài liệu/hướng dẫn/etc nào bằng tiếng Anh không? – jammycakes

0

Vì biểu đồ đối tượng có thể tuần hoàn, bạn không thể tạo cấu trúc dựa trên cây từ nó. Đặt cược tốt nhất của bạn là đại diện cho đồ thị đối tượng bởi các thành phần đơn giản nhất của nó: các nút và vectơ.

Cụ thể hơn, làm cho mỗi nút (đối tượng) thành phần có ID duy nhất (có thể được cung cấp bởi phương thức GetHashCode() của C#?). Tham chiếu đến các đối tượng khác (vectơ) sẽ được xử lý bằng cách tham chiếu ID của đối tượng.

lớp Ví dụ (lưu ý rằng tôi không biết C# nên cú pháp của tôi có thể là một chút off):

public class SomeType { 
    public int myInt { get; set; } 
} 

public class AnotherType { 
    public string myString { get; set; } 
    public SomeType mySomeType { get; set; } 
} 

public class LastType { 
    public SomeType mySomeType { get; set; } 
    public AnotherType myAnotherType { get; set; } 
} 

public class UserTypes{ 
    static void Main() 
    { 
     LastType lt = new LastType(); 
     SomeType st = new SomeType(); 
     AnotherType atype = new AnotherType(); 

     st.myInt = 7; 
     atype.myString = "BOB"; 
     atype.mySomeType = st; 
     lt.mySomeType = st; 
     lt.myAnotherType = atype; 

     string xmlOutput = YourAwesomeFunction(lt); 
    } 
} 

Sau đó, chúng tôi cho rằng giá trị của xmlOutput là một cái gì đó như thế này (lưu ý rằng ID giá trị được lựa chọn là hoàn toàn tổng hợp):

<ObjectMap> 
<LastType id="0"> 
    <mySomeType idref="1" /> 
    <myAnotherType idref="2" /> 
</LastType> 

<SomeType id="1"> 
    <myInt>7</myInt> 
</SomeType> 

<AnotherType id="2"> 
    <myString>BOB</myString> 
    <mySomeType idref="1" /> 
</AnotherType> 
</ObjectMap> 
+0

Điều này không thực sự trả lời câu hỏi của tôi. Như tôi đã nói, vấn đề đã được giải quyết - nó chỉ là tài liệu xấu. Và các biểu đồ đối tượng có thể tuần hoàn sẽ không nhất thiết là một vấn đề nếu các phép biến đổi XSLT của bạn đang đánh giá chúng một cách lười biếng. – jammycakes

6

có một (điều MSDN rất) cũ có tựa đề XPath Querying Over Objects with ObjectXPathNavigator mà thực hiện một lớp học tương tự (Còn được gọi là ObjectXPathNavigator, thú vị đủ). Tôi đã sử dụng lứa tuổi này trước đây để truy vấn một số dữ liệu từ Visual SourceSafe và xây dựng một nguồn cấp dữ liệu RSS từ các thay đổi, và nó hoạt động khá tốt. Tuy nhiên, tôi không làm XSLT với nó, vì vậy tôi không chắc liệu nó có hoạt động hay không. Ngoài ra, lưu ý rằng nó đã được viết cho Framework 1.0, vì vậy bạn có thể cần phải cập nhật nó cho các frameoworks gần đây hơn. Ngoài ra, có thể có cách tốt hơn để làm điều này ngay bây giờ, nhưng nó sẽ cung cấp cho bạn một điểm khởi đầu (và bài viết làm một công việc tốt đẹp để giải thích cách nó hoạt động).

+1

Không thấy nơi bạn có thể lấy nguồn hoặc thậm chí cả các tệp nhị phân từ liên kết được cung cấp. – jcmcbeth

+0

https://github.com/AndrewMayorov/ObjectXPathNavigator – user1709408

Các vấn đề liên quan