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