首页 新闻 赞助 找找看

XmlReader.Create和xmlDocument.Load方法的区别

0
悬赏园豆:10 [已解决问题] 解决于 2018-03-13 10:40

xml文本里面有个换行的编码,不过用xmlreader读出来的时候,换行编码无效。会解析成空字符串,用xmldocument.load就可以换行。 不知道是什么原因xmlreader解析不了
这个换行编码

 

xml文本里面含有下面的内容:

    <Field>
        <Replace>&#13;</Replace>
    </Field>

 

1. 用下面方法生成xml的时候,上面replace里面的内容是空内容

            XmlReaderSettings settings = new XmlReaderSettings();
XmlDocument xmlDocument = new XmlDocument(); settings.DtdProcessing
= DtdProcessing.Prohibit;
settings.XmlResolver
= null; XmlReader xmlReader = XmlReader.Create(path, settings); xmlDocument.Load(xmlReader);

显示结果是

    <Field>
        <Replace></Replace>
    </Field>

2. 用下面方法,上面replace里面的内容就是换行符

           XmlDocument doc=new XmlDocument();
            doc.Load(path);

显示结果是

    <Field>
        <Replace>

        </Replace>
    </Field>

四龙须的主页 四龙须 | 初学一级 | 园豆:172
提问于:2015-09-10 14:53
< >
分享
最佳答案
0

看了楼主下面的举例说明应该是想知道在

XmlDocument.Load(xmlReader)方法中换行的&#13编码就不能读取出来
XmlDocument.Load(path)方法中换行的&#13就不能读取出来呢?
这个主要是因为XmlReader会自动将\ r \ n \标准化为\ n来满足XML规范要求。
查看源码可以知:XmlDocument.Load的几个重载方法Load(Path)、Load(TextReader)和Load(Stream)实现方式都是通过XmlTextReader的方法进行文档遍历读取内容
// System.Xml.XmlDocument
public virtual void Load(string filename)
{
    XmlTextReader xmlTextReader = this.SetupReader(new XmlTextReader(filename, this.NameTable));
    try
    {
        this.Load(xmlTextReader);
    }
    finally
    {
        xmlTextReader.Close();
    }
}
Load(Path)方法
// System.Xml.XmlDocument
public virtual void Load(Stream inStream)
{
    XmlTextReader xmlTextReader = this.SetupReader(new XmlTextReader(inStream, this.NameTable));
    try
    {
        this.Load(xmlTextReader);
    }
    finally
    {
        xmlTextReader.Impl.Close(false);
    }
}
Load(Stream)方法
// System.Xml.XmlDocument
public virtual void Load(TextReader txtReader)
{
    XmlTextReader xmlTextReader = this.SetupReader(new XmlTextReader(txtReader, this.NameTable));
    try
    {
        this.Load(xmlTextReader);
    }
    finally
    {
        xmlTextReader.Impl.Close(false);
    }
}
Load(TextReader)方法

XmlDocment.Load(XmlReader)通过XmlReader类的Read方法实现xml文档内容的读取

// System.Xml.XmlDocument
public virtual void Load(XmlReader reader)
{
    try
    {
        this.IsLoading = true;
        this.actualLoadingStatus = true;
        this.RemoveAll();
        this.fEntRefNodesPresent = false;
        this.fCDataNodesPresent = false;
        this.reportValidity = true;
        XmlLoader xmlLoader = new XmlLoader();
        xmlLoader.Load(this, reader, this.preserveWhitespace);
    }
    finally
    {
        this.IsLoading = false;
        this.actualLoadingStatus = false;
        this.reportValidity = true;
    }
}
Load(XmlReader)方法

public class XmlTextReader : XmlReader, IXmlLineInfo, IXmlNamespaceResolver

XmlTextReader 继承至XmlReader重写了Read方法的实现非XML标准化。
 
查考如下:
收获园豆:10
Simen.Net | 初学一级 |园豆:127 | 2018-03-12 23:45

非常感谢,解决了多年的疑惑。

四龙须 | 园豆:172 (初学一级) | 2018-03-13 10:40

@四龙须: 多看官方的文档,实在搞不明白就去看https://github.com/dotnet 源码。如果觉得实在还有问题说不定你发现了微软的一个bug

Simen.Net | 园豆:127 (初学一级) | 2018-03-13 21:30
其他回答(1)
0

XmlReaderSettings.CheckCharacters = false;

Launcher | 园豆:45045 (高人七级) | 2015-09-10 15:03

试了你的方法,没有效果。加上XmlReaderSettings.CheckCharacters = false;之后,用xmlreader输出的xml结果还是忽略enter键的ASCII编码.

显示结果是

    <Field>
        <Replace></Replace>
    </Field>

支持(0) 反对(0) 四龙须 | 园豆:172 (初学一级) | 2015-09-11 16:11

@四龙须: 你按照这种方式读读:http://blog.csdn.net/yukaizhao/article/details/6618707

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-09-11 16:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册