当前位置:  开发笔记 > 编程语言 > 正文

包含名称空间的XML元素的XDocument或XElement解析

如何解决《包含名称空间的XML元素的XDocument或XElement解析》经验,为你挑选了2个好方法。

我尝试读取从log4net UdpAppender捕获的以下字符串.


    Log entry 103
    
        
    

在尝试XElement.Parse或XDocument.Parse内容时,它会抛出异常:

'log4net'是未声明的命名空间.第1行,第2位.

我知道我可以在原始字符串中搜索并替换"log4net:"并删除它,允许我成功解析XML,但是有更好的方法吗?这是捕获的完整数据(重新格式化以允许读取),没有制作或删除xml命名空间声明.



1> Soonts..:

首先,创建一个XmlNamespaceManager类的实例,并将名称空间添加到该类,例如

    XmlNamespaceManager mngr = new XmlNamespaceManager( new NameTable() );
    mngr.AddNamespace( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
    mngr.AddNamespace( "xsd", "http://www.w3.org/2001/XMLSchema" );

要使用这些命名空间映射解析XML字符串,请调用以下函数,将XmlNamespaceManager的实例与您添加到其中的命名空间一起传递:

/// Same as XElement.Parse(), but supports XML namespaces.
/// A String that contains XML.
/// The XmlNamespaceManager to use for looking up namespace information.
/// An XElement populated from the string that contains XML.
public static XElement ParseElement( string strXml, XmlNamespaceManager mngr )
{
    XmlParserContext parserContext = new XmlParserContext( null, mngr, null, XmlSpace.None );
    XmlTextReader txtReader = new XmlTextReader( strXml, XmlNodeType.Element, parserContext );
    return XElement.Load( txtReader );
}


@JohnSaunders看起来你的评论已被弃用,而XmlTextReader则不是:-)

2> Ben M..:

你真的只有两个选择:

    根据您的建议,从XML中删除"log4net:";

    修改XML以声明命名空间,可能最容易通过将片段(通过StringBuilder)包装在具有声明的根元素中来实现.

严格地说,您的示例是格式错误的XML - XDocument/XElement不会解析它也就不足为奇了.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有