为什么XmlDocument.Load(XmlReader reader)调用XmlNode.RemoveAll()?

西恩717

调用SimpleClass.LoadXml时,将引发以下异常

你调用的对象是空的。在System.Xml.XmlNode.RemoveChild(XmlNode oldChild)在System.Xml.XmlNode.RemoveAll()在System.Xml.XmlDocument.Load(XmlReader reader)

SimpleClass这个样子的

public static class SimpleClass 
{
     static XmlDocument _myXmlDocu = new XmlDocument();

     /// <summary>
        /// Method to load embedded XML data file from assembly.
        /// </summary>
        private static void LoadXml()
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            XmlTextReader reader = new XmlTextReader(asm.GetManifestResourceStream("MyNameSpace.data.xml"));
            _myXmlDocu.Load(reader);
        }
}

我不明白为什么XmlNode.RemoveAll()在致电时被称为_myXmlDocu.Load(reader)??

该代码在IIS上的ASP.NET WebForms应用程序中执行。

数据库

XmlDocument.Load()调用XmlNode.RemoveAll(),以便在读取XML文件之前从XML文档中删除所有现有数据,因为Load() XmlDocument新读取的XML数据替换的当前内容,而不是合并或附加它们。

更好的问题是,为什么会RemoveAll()引发异常?最可能的原因是由于多线程:您进程的两个线程正在尝试_myXmlDocu一次初始化您的静态变量,并且彼此步进。(据文档,实例成员XmlDocument不能保证是线程安全的)。看来您试图将清单资源流中的XML作为单个实例缓存在内存中,只能读取一次。如果是这样,则应按照此处的说明以线程安全的方式初始化缓存:在C#中实现Singleton Pattern

例如,这是一种在内部缓存XML资源的简单线程安全方法SimpleClass它将资源加载到该类的静态构造函数中:

public static class SimpleClass
{
    const string resourceName = "MyNameSpace.data.xml";

    static XmlDocument _myXmlDocu = null;

    static SimpleClass()
    {
        _myXmlDocu = new XmlDocument();
        Assembly asm = Assembly.GetExecutingAssembly();
        using (var reader = new XmlTextReader(asm.GetManifestResourceStream(resourceName)))
        {
            _myXmlDocu.Load(reader);
        }
    }

    public static XmlDocument GetResourceData()
    {
        return _myXmlDocu;
    }
}

这是第一次加载XML资源文件,这是第一次使用静态方法或属性SimpleClass它对应于链接文章中单例模式的“第四版”。

如果您SimpleClass实际上并不简单,并且具有许多不相关的静态属性和方法,需要您推迟加载XML直到实际使用XML,请考虑在链接的文章中使用该模式的第五个或第六个版本。

顺便说一句,尽管对XmlDocument(如Load())的写入操作绝对不是线程安全的,但也未读取操作记录为线程安全的。请参见从XmlDocument对象线程读取是否安全?进行讨论。您可能需要重新考虑此缓存策略是否有意义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ArrayList移除vs removeAll

来自分类Dev

为什么IdentityHashMap.keySet()。removeAll(keys)不使用身份?是虫子吗?

来自分类Dev

removeAll()不删除对象

来自分类Dev

对XmlDocument中的所有XmlNode进行排序

来自分类Dev

为什么XDocument.Load()和XmlDocument.LoadXml()无法使用注释包含两个以上“-”符号的方式加载XML?

来自分类Dev

为什么我的JavaScript函数在jQuery load()调用完成加载之前运行?

来自分类Dev

将XmlNode转换为XmlReader

来自分类Dev

List <T> .RemoveAll方法什么都不删除时如何引发异常?

来自分类Dev

removeAll ArrayList与LinkedList的性能

来自分类Dev

使用Collection自身调用的removeAll()的潜在错误

来自分类Dev

ArrayList removeAll()不删除对象

来自分类Dev

为什么XmlReader跳过元素?

来自分类Dev

为什么XmlReader.IsEmptyElement返回不同的值?

来自分类Dev

为什么我的方法被Page_Load()调用了两次(或更多次)

来自分类Dev

分页3-为什么我的重试页脚不调用PagingSource的load方法?

来自分类Dev

为什么IdentityHashMap.keySet()。removeAll(keys)不使用身份?是虫子吗?

来自分类Dev

问题与list.removeAll()

来自分类Dev

对XmlDocument中的所有XmlNode进行排序

来自分类Dev

为什么XDocument.Load()和XmlDocument.LoadXml()无法使用注释包含两个以上“-”符号的方式加载XML?

来自分类Dev

List <T> .RemoveAll作为并行

来自分类Dev

为什么要调用?

来自分类Dev

为什么需要判断元素是否存在于removeAll(Collection c)的集合中?

来自分类Dev

removeAll ArrayList与LinkedList的性能

来自分类Dev

使用XmlReader时,HasValue属性返回False!为什么?

来自分类Dev

为什么XmlReader.IsEmptyElement返回不同的值?

来自分类Dev

为什么load事件被ProgressEvent对象调用?

来自分类Dev

Java 1.8 覆盖的 equals() 未被 Collection removeAll() 调用

来自分类Dev

RemoveAll 不删除记录

来自分类Dev

C# 使用 XmlReader 而不是 XmlDocument 获得额外的空白值

Related 相关文章

  1. 1

    ArrayList移除vs removeAll

  2. 2

    为什么IdentityHashMap.keySet()。removeAll(keys)不使用身份?是虫子吗?

  3. 3

    removeAll()不删除对象

  4. 4

    对XmlDocument中的所有XmlNode进行排序

  5. 5

    为什么XDocument.Load()和XmlDocument.LoadXml()无法使用注释包含两个以上“-”符号的方式加载XML?

  6. 6

    为什么我的JavaScript函数在jQuery load()调用完成加载之前运行?

  7. 7

    将XmlNode转换为XmlReader

  8. 8

    List <T> .RemoveAll方法什么都不删除时如何引发异常?

  9. 9

    removeAll ArrayList与LinkedList的性能

  10. 10

    使用Collection自身调用的removeAll()的潜在错误

  11. 11

    ArrayList removeAll()不删除对象

  12. 12

    为什么XmlReader跳过元素?

  13. 13

    为什么XmlReader.IsEmptyElement返回不同的值?

  14. 14

    为什么我的方法被Page_Load()调用了两次(或更多次)

  15. 15

    分页3-为什么我的重试页脚不调用PagingSource的load方法?

  16. 16

    为什么IdentityHashMap.keySet()。removeAll(keys)不使用身份?是虫子吗?

  17. 17

    问题与list.removeAll()

  18. 18

    对XmlDocument中的所有XmlNode进行排序

  19. 19

    为什么XDocument.Load()和XmlDocument.LoadXml()无法使用注释包含两个以上“-”符号的方式加载XML?

  20. 20

    List <T> .RemoveAll作为并行

  21. 21

    为什么要调用?

  22. 22

    为什么需要判断元素是否存在于removeAll(Collection c)的集合中?

  23. 23

    removeAll ArrayList与LinkedList的性能

  24. 24

    使用XmlReader时,HasValue属性返回False!为什么?

  25. 25

    为什么XmlReader.IsEmptyElement返回不同的值?

  26. 26

    为什么load事件被ProgressEvent对象调用?

  27. 27

    Java 1.8 覆盖的 equals() 未被 Collection removeAll() 调用

  28. 28

    RemoveAll 不删除记录

  29. 29

    C# 使用 XmlReader 而不是 XmlDocument 获得额外的空白值

热门标签

归档