2013-12-17 21 views
8

Tôi nhận 'xsi' là tiền tố không khai báo sử dụng XmlDocument.'xsi' là tiền tố không khai báo sử dụng XmlDocument

Tôi cố gắng để đọc một tập tin trong đó có các sơ đồ sau:

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2" 
    xmlns:gx="http://www.google.com/kml/ext/2.2" 
    xmlns:kml="http://www.opengis.net/kml/2.2" 
    xmlns:atom="http://www.w3.org/2005/Atom"> 
     <Document> 
      <Document id="robert" xsi:schemaLocation="http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd"> 
       <Placemark> 
       <description>test</description> 
       </Placemark> 
     </Document> 
    </Document> 
</kml> 

Tôi đã thử những điều sau đây:

XmlDocument xmldoc = new XmlDocument(); 
    using (XmlTextReader tr = new XmlTextReader(strXmlFile)) 
    { 
     //tr.Namespaces = false; (uncomment to ignore namespace) 
     xmldoc.Load(tr); // 'xsi' is an undeclared prefix error here 
    } 

Nếu tôi bỏ ghi chú dòng để bỏ qua không gian tên, nó tải ok nhưng không lưu được XmlDocument sau này. Vì vậy, bỏ qua nó sẽ không phải là một giải pháp. Có ai biết làm thế nào để tải đúng lược đồ? Vấn đề/lỗi dường như là trong nút này:

<Document id="robert" xsi:schemaLocation="http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd"> 

Update # 1 tôi thử như sau:

XmlDocument xmldoc = new XmlDocument(); 
NameTable nt = new NameTable(); 
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); 
nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); 
XmlReaderSettings xset = new XmlReaderSettings(); 
xset.ConformanceLevel = ConformanceLevel.Fragment; 
XmlReader rd = XmlReader.Create(new StringReader(strXmlFile), xset, context); 
xmldoc.Load(rd); // error is still on this line 

Nhưng đang nhận lỗi này ngay bây giờ:

"Các quy định không thể chèn nút dưới dạng con hợp lệ của nút này, bởi vì nút được chỉ định là loại sai. " Dường như tôi đang tiến gần hơn ...

Trả lời

9

Giải pháp:

Tôi đã có thể giải quyết vấn đề! Đây là mã cuối cùng:

XmlDocument xmldoc = new XmlDocument(); 
XmlReaderSettings settings = new XmlReaderSettings { NameTable = new NameTable() }; 
XmlNamespaceManager xmlns = new XmlNamespaceManager(settings.NameTable); 
xmlns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
XmlParserContext context = new XmlParserContext(null, xmlns, "", XmlSpace.Default); 
XmlReader reader = XmlReader.Create(strXmlFile, settings, context); 
xmldoc.Load(reader); 

Cũng một tip hơn, khi tìm kiếm thông qua các nút, hãy nhớ để thiết lập các không gian tên đúng, ví dụ để tìm kiếm dấu vị trí trên, đây sẽ là định dạng:

// Setup default namespace manager for searching through nodes 
XmlNamespaceManager manager = new XmlNamespaceManager(xmldoc.NameTable); 
string defaultns = xmldoc.DocumentElement.GetNamespaceOfPrefix(""); 
manager.AddNamespace("ns", defaultns); 

// get a list of all <Placemark> nodes 
XmlNodeList listOfPlacemark = xmldoc.SelectNodes("//ns:Placemark", manager); 

// iterate over the <Placemark> nodes 
foreach (XmlNode singlePlaceMark in listOfPlacemark) 

// Get the description subnode 
XmlNode descriptionNode = singlePlaceMark.SelectSingleNode("ns:description", manager); 

.. 
7

Bạn đang thiếu việc kê khai xsi namespace:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

tại tài liệu của bạn sẽ giống như thế này:

<kml xmlns="http://www.opengis.net/kml/2.2" 
      xmlns:gx="http://www.google.com/kml/ext/2.2" 
      xmlns:kml="http://www.opengis.net/kml/2.2" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:atom="http://www.w3.org/2005/Atom"> 
..... 
</kml> 
+2

Cảm ơn bạn đã phản hồi nhanh chóng. Một câu hỏi, làm thế nào bạn sẽ làm điều đó trước khi xmldoc.load (trong mã nguồn) vì tôi không thể thay đổi bản thân tập tin gốc. Cảm ơn một lần nữa. – user3062349

+0

Nếu tệp thiếu tệp, thì tệp đó là tệp xml không hợp lệ (bạn không thể sử dụng không gian tên không khai báo) và cần được sửa. Từ đâu bạn nhận được những tệp này –

+0

Tệp là tệp KML google earth hợp lệ ở định dạng XML. Nó mở ra một cách chính xác trong Google Earth. – user3062349

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