2013-08-13 32 views
5

Tôi đang viết một mô-đun Posh khá quan trọng để trở thành đầu cuối CLI cho một tập hợp các Dịch vụ Web RESTful. Tôi có một vấn đề kỳ lạ tôi đã có thể mô tả, nhưng không tìm thấy một giải pháp sạch.Powershell - Không phải tất cả thuộc tính XML đều được chuyển xuống đường ống

Tôi không phải lúc nào cũng biết thuộc tính mong đợi và một số nút có thể có thuộc tính nhất định, các nút khác có thể không có thuộc tính đó. Vấn đề của tôi đôi khi (đọc: thường) nếu một thuộc tính không có mặt trong tất cả các nút, nó sẽ không được chuyển xuống đường ống cho bất kỳ nút nào. Nó dường như liên quan đến những thuộc tính nào nằm trong nút đầu tiên trong XML.

Đối với một ví dụ rất đơn giản, coi đây là nội dung của một tập tin XML example.xml:

<members> 
    <member> 
     <name>Joe</name> 
     <rank>Grand Poobah</rank> 
     <serialnumber>1234</serialnumber> 
    </member> 
    <member> 
     <name>Fred</name> 
     <serialnumber>1234</serialnumber> 
    </member> 
</members> 

tôi nhập nó và gán nó vào một xml biến đúc:

[xml]$stuff = Get-Content .\example.xml 

Sau đó, Tôi đặt nó vào bảng định dạng (hoặc khung nhìn ra ngoài, xuất-csv, v.v.)

$stuff.members.member | ft -AutoSize 

name rank   serialnumber 
---- ----   ------------ 
Joe Grand Poobah 1234 
Fred    1234 

Hoạt động tốt.

Bây giờ, nếu nút FIRST không có thuộc tính rank:

<members> 
    <member> 
     <name>Fred</name> 
     <serialnumber>1234</serialnumber> 
    </member> 
    <member> 
     <name>Joe</name> 
     <rank>Grand Poobah</rank> 
     <serialnumber>1234</serialnumber> 
    </member> 
</members> 

Bây giờ, khi tôi làm việc nhập khẩu giống nhau và vượt qua nó ra đường ống, các "bậc" thuộc tính không được thông qua xuống đường ống .

$stuff.members.member | ft -AutoSize 

name serialnumber 
---- ------------ 
Fred 1234 
Joe 1234 

tôi có thể buộc nó bằng cách đặt tên một cách rõ ràng các thuộc tính:

$stuff.members.member | select-object -Property name, rank, serialnumber | ft 

name rank   serialnumber 
---- ----   ------------ 
Fred    1234 
Joe Grand Poobah 1234 

Rõ ràng đặt tên cho các thuộc tính là một công thức cho các lỗi, như là thuộc tính có thể được thêm vào mà không báo trước. Tôi muốn giữ cho mã linh hoạt để đối phó với các thuộc tính mới nếu có thể.

Tôi nghĩ rằng tôi có thể sử dụng "select-object -property *" nhưng điều đó cho biết thêm rất nhiều quyền hạn chèn vào công cụ XML tôi không muốn, và vẫn không ống thuộc tính xếp hạng.

$stuff.members.member | select-object -Property *| ft -AutoSize 
name serialnumber LocalName NamespaceURI Prefix NodeType ParentNode OwnerDocument IsEmpty Attributes 
---- ------------ --------- ------------ ------ -------- ---------- ------------- ------- ---------- 
Fred 1234   member       Element members #document  False {} 
Joe 1234   member       Element members #document  False {} 

Bất kỳ ai biết cách nào tốt để giải quyết tình trạng này? Tôi đã không tìm thấy bất kỳ manh mối tốt nào trên tìm kiếm của Google.

Trả lời

5

Phần tử XML chắc chắn là "được chuyển xuống đường ống". Những gì bạn đang xem là một đặc thù của format-table: Nó chỉ nhìn vào đối tượng đầu tiên trong một danh sách để tìm ra các cột cần in.

Điều này chủ yếu là vì lý do hiệu suất. Nếu không, format-table sẽ phải lặp lại danh sách hai lần - một lần để tìm ra thuộc tính nào cần xuất và lần thứ hai để thực sự xuất chúng. Ngoài ra, thường xuyên hơn không, các mục trong danh sách là thống nhất.

Trong mọi trường hợp khác, các quy tắc "rõ ràng là tốt hơn so với tiềm ẩn" được áp dụng:

$stuff.members.member | ft name, rank, serialnumber -AutoSize 
+1

Cảm ơn đã phản ứng nhanh chóng. Bạn đúng và lời giải thích của bạn có ý nghĩa hoàn hảo, nhưng nó áp dụng cho nhiều lệnh như export-csv, out-gridview.Tôi chỉ cố gắng piping nó để định dạng danh sách, mà rõ ràng là không cần phải tính toán cột để hiển thị, và tất cả các thuộc tính hiển thị. Vì vậy, yup, bạn nói đúng, tất cả họ đều đi ra ngoài đường ống. Cảm ơn! – user2678909

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