代码之家  ›  专栏  ›  技术社区  ›  James Sulak

加载XDocument时可以使用预定义的名称空间吗?

  •  4
  • James Sulak  · 技术社区  · 17 年前

    <root>
      <a:element/>
    </root>
    

    由于前缀“a”从未分配名称空间URI,因此文档无效。当我使用以下代码加载这样的XML文档时:

    using (StreamReader reader = new StreamReader(new FileStream(inputFileName,    
           FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) {
                doc = XDocument.Load(reader, LoadOptions.PreserveWhitespace);
    }
    

    它抛出一个异常,声明(正确地)文档包含未声明的名称空间并且格式不正确。

    那么,我可以预定义默认名称空间前缀->解析器所依赖的名称空间URI对?XMLNamespaceManager看起来很有希望,但不知道如何将其应用于这种情况(或者如果我可以的话)。

    2 回复  |  直到 17 年前
        1
  •  5
  •   Marc Gravell    17 年前

    您可以创建一个 XmlReader 带着 XmlParserContext XmlDocument XDocument :

    class SimpleNameTable : XmlNameTable {
        List<string> cache = new List<string>();
        public override string Add(string array) {
            string found = cache.Find(s => s == array);
            if (found != null) return found;
            cache.Add(array);
            return array;
        }
        public override string Add(char[] array, int offset, int length) {
            return Add(new string(array, offset, length));
        }
        public override string Get(string array) {
            return cache.Find(s => s == array);
        }
        public override string Get(char[] array, int offset, int length) {
            return Get(new string(array, offset, length));
        }
    }
    static void Main() {
        XmlNamespaceManager mgr = new XmlNamespaceManager(new SimpleNameTable());
        mgr.AddNamespace("a", "http://foo/bar");
        XmlParserContext ctx = new XmlParserContext(null, mgr, null,
            XmlSpace.Default);
        using (XmlReader reader = XmlReader.Create(
            new StringReader(@"<root><a:element/></root>"), null, ctx)) {
    
            XDocument doc = XDocument.Load(reader);
    
            //XmlDocument doc = new XmlDocument();
            //doc.Load(reader);
        }
    }
    
        2
  •  2
  •   Gideon Engelberth    17 年前

    XDocument LoadWithPrefix(Stream stream)
    {
        XmlNamespaceManager mgr = new XmlNamespaceManager(new NameTable());
        mgr.AddNamespace("a", "http://foo/bar");
        XmlParserContext ctx = new XmlParserContext(null, mgr, null, XmlSpace.Default);
        using (XmlReader reader = XmlReader.Create(stream, null, ctx)) 
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(reader);
            return XDocument.Parse(doc.OuterXml);
        }
    }