2013-12-17 124 views
8

我收到'xsi'是使用XmlDocument的未聲明前綴。'xsi'是使用XmlDocument的未聲明前綴

我想讀它具有以下模式的文件:

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

我曾嘗試以下:

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 
    } 

如果我取消註釋行忽略命名空間,它加載OK但稍後未能保存XmlDocument。所以忽略它不會是一個解決方案。有誰知道如何正確加載架構?問題/錯誤似乎是在這個節點:

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

更新#1 我試過如下:

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 

,但我接受現在這個錯誤:

「的規定節點不能作爲此節點的有效子節點插入,因爲指定節點的類型是錯誤的。「它看起來像我越來越近......

回答

9

解決方案:

我能解決問題!下面是最終代碼:

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); 

另外一個技巧,通過節點搜索時,記得要設置正確的命名空間,例如搜索地標之上,這將是格式:

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

你缺少xsi命名空間聲明:

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

現在你的文件應該是這個樣子:

<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

感謝您的及時迴應。一個問題,你將如何在xmldoc.load之前(在源代碼中)這樣做,因爲我無法更改原始文件本身。再次感謝。 – user3062349

+0

如果文件丟失,那麼它是一個無效的xml文件(您不能使用未聲明的名稱空間)並需要修復。從哪裏獲取這些文件 –

+0

該文件是XML格式的有效谷歌地球KML文件。它確實在谷歌地球上開放。 – user3062349

相關問題