2010-03-24 31 views
10

Tôi đã có một tài liệu Xml để xác định và tham chiếu một số không gian tên. Tôi tải nó vào một đối tượng XmlDocument và theo sự hiểu biết tốt nhất của tôi, tôi tạo một đối tượng XmlNamespaceManager để truy vấn Xpath. Vấn đề là tôi nhận được ngoại lệ XPath rằng không gian tên "của tôi" không được xác định. Làm cách nào để tôi có được trình quản lý không gian tên để thấy rằng các không gian tên mà tôi đang tham chiếu đã được xác định. Hay đúng hơn là làm thế nào để tôi nhận được các định nghĩa vùng tên từ tài liệu tới trình quản lý không gian tên.Truy vấn XmlDocument mà không nhận được tiền tố 'Không gian tên không được xác định'

Ngoài ra, tt cũng cho tôi biết rằng bạn phải cung cấp trình quản lý không gian tên cho tài liệu mà bạn tạo từ tên tài liệu ở nơi đầu tiên. Ngay cả khi bạn cần phải mã hóa các không gian tên thủ công tại sao bạn không thể thêm chúng trực tiếp vào tài liệu. Tại sao bạn luôn phải vượt qua trình quản lý không gian tên này với mọi truy vấn? Những gì không thể XmlDocument chỉ biết?

Code:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(programFiles + @"Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\HfscBookingWorkflow\template.xml"); 
XmlNamespaceManager ns = new XmlNamespaceManager(xmlDoc.NameTable); 

XmlNode referenceNode = xmlDoc.SelectSingleNode("/my:myFields/my:ReferenceNumber", ns); 
referenceNode.InnerXml = this.bookingData.ReferenceNumber; 

XmlNode titleNode = xmlDoc.SelectSingleNode("/my:myFields/my:Title", ns); 
titleNode.InnerXml = this.bookingData.FamilyName; 

Xml:

<?xml version="1.0" encoding="UTF-8" ?> 
    <?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:Inspection:-myXSD-2010-01-15T18-21-55" solutionVersion="1.0.0.104" productVersion="12.0.0" PIVersion="1.0.0.0" ?> 
    <?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?> 
    <my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003"> 
    <my:DateRequested xsi:nil="true" /> 
    <my:DateVisited xsi:nil="true" /> 
    <my:ReferenceNumber /> 
    <my:FireCall>false</my:FireCall> 

Cập nhật:

ns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
ns.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml"); 
ns.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003"); 
ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55"); 

này không được công việc, nhưng nó có nghĩa là của tôi phải cứng mã để xml đặc biệt này lược đồ. Lược đồ này đại diện cho một mẫu biểu mẫu infopath. Đặc biệt, không gian tên của tôi sẽ khác nhau đối với mọi mẫu biểu mẫu vì vậy tôi thực sự không muốn mã hóa nó. Nó sẽ là tốt đẹp để tìm một cách sạch sẽ để có được không gian tên này từ xml mà không cần đến RegEx.

Tôi đã hy vọng rằng XmlNamespaceManager sẽ chỉ sắp xếp các định nghĩa vùng tên tạo thành NameTable. Tôi có nghĩa là họ trong Xml nhưng tôi vẫn phải xác định chúng.

Trả lời

5
ns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
ns.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml"); 
ns.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003"); 
ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55"); 

này không được công việc, nhưng nó có nghĩa là của tôi phải cứng mã để schema xml đặc biệt này. Lược đồ này đại diện cho một mẫu biểu mẫu infopath. Đặc biệt, không gian tên của tôi sẽ khác nhau đối với mọi mẫu biểu mẫu vì vậy tôi thực sự không muốn mã hóa nó. Nó sẽ là tốt đẹp để tìm một cách sạch sẽ để có được không gian tên này từ xml mà không cần đến Regex.

Tôi đã hy vọng rằng XmlNamespaceManager sẽ chỉ sắp xếp các định nghĩa vùng tên tạo thành NameTable. Tôi có nghĩa là họ trong Xml nhưng tôi vẫn phải xác định chúng.

1

Bạn đã xác định "của tôi" trong trình quản lý không gian tên chưa?

ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55"); 

Hoặc tốt hơn - chọn thứ gì đó không có khả năng xung đột. Nó có vẻ kỳ lạ mà nó đã không nhặt nó từ bảng tên, mặc dù.

+1

NameTable chỉ là một tối ưu hóa để lưu trữ tên. Nó thực sự không có gì để làm với không gian tên. Và ngay cả khi XmlNamespaceManager có thể phỏng đoán tất cả các không gian tên và tiền tố từ tài liệu XML sẽ không giúp ích trong trường hợp chung vì tính chất không gian tên XML, ví dụ: điều gì sẽ bản đồ XmlNamespaceManager "của tôi" tiền tố trong trường hợp này:

+0

@Oleg - Tôi nghĩ bạn nên giữ câu trả lời của bạn (thay vì xóa nó) - đó là một câu trả lời hay cho "tại sao?". –

+0

Tôi đã không tự thêm nó vì url cho không gian tên có thể thay đổi. Các lĩnh vực tôi đang cố gắng để có được với XPath sẽ không. –

3

Đây là câu trả lời cho "Điều gì không thể XmlDocument chỉ biết?" câu hỏi.

NameTable chỉ là tối ưu hóa để lưu trữ tên. Nó thực sự không có gì để làm với không gian tên.

Và ngay cả khi XmlNamespaceManager có thể phỏng đoán tất cả các không gian tên và tiền tố từ tài liệu XML sẽ không giúp ích trong trường hợp chung vì tính chất không gian tên XML, ví dụ: điều gì sẽ XmlNamespaceManager bản đồ "của tôi" tiền tố trong trường hợp này:

<root> 
    <foo xmlns:my="blah"/> 
    <foo xmlns:my="balh-blah-blah"/> 
</root> 
0

Đối với tôi với InfoPath 2007 này đã giải quyết được vấn đề

static public XmlNamespaceManager GetNameSpaceManager(this XmlDocument document) 
{ 
    XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(document.NameTable); 

    xmlNamespaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
    xmlNamespaceManager.AddNamespace("dfs", "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution"); 
    xmlNamespaceManager.AddNamespace("d", "http://schemas.microsoft.com/office/infopath/2003/ado/dataFields"); 
    xmlNamespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-03-29T06:28:28"); 
    xmlNamespaceManager.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003"); 

    return xmlNamespaceManager; 
} 
Các vấn đề liên quan