【问题标题】:'xsi' is an undeclared prefix using XmlDocument'xsi' 是使用 XmlDocument 的未声明前缀
【发布时间】:2014-01-05 10:41:44
【问题描述】:

我收到的“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
    }

如果我取消注释该行以忽略命名空间,它会加载正常,但稍后无法保存 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

但现在收到此错误:

"指定的节点不能作为该节点的有效子节点插入,因为指定的节点类型错误。"看来我越来越近了……

【问题讨论】:

    标签: c# xml parsing


    【解决方案1】:

    解决方案:

    我能够解决问题!这是最终代码:

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

    还有一点提示,在搜索节点时,记得设置正确的命名空间,例如上面搜索Placemark,格式如下:

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

    【讨论】:

      【解决方案2】:

      您缺少xsinamespace 声明:

      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>
      

      【讨论】:

      • 感谢您的及时回复。一个问题,你将如何在 xmldoc.load (在源代码中)之前这样做,因为我无法更改原始文件本身。再次感谢。
      • 如果文件丢失,那么它是一个无效的 xml 文件(不能使用未声明的命名空间),需要修复。你从哪里得到这些文件
      • 该文件是 XML 格式的有效 google earth KML 文件。它确实在 Google 地球中正确打开。
      • 看看这里 - msdn.microsoft.com/en-us/library/… 看看它是否适合你
      • 再次感谢马里奥。正如你所建议的,我尝试了代码,我越来越接近解决它,但仍有一些调整要做......(见更新#1)
      猜你喜欢
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 2020-08-13
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多