首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将XML字符串注入XmlWriter时缩进

将XML字符串注入XmlWriter时缩进
EN

Stack Overflow用户
提问于 2009-05-13 15:24:51
回答 5查看 13.9K关注 0票数 18

我有一个写入文件的XmlTextWriter和一个使用该文本写入器的XmlWriter。此文本编写器设置为输出制表符缩进的XML:

代码语言:javascript
复制
XmlTextWriter xtw = new XmlTextWriter("foo.xml", Encoding.UTF8);
xtw.Formatting = Formatting.Indented;
xtw.IndentChar = '\t';
xtw.Indentation = 1;

XmlWriter xw = XmlWriter.Create(xtw);

根据Jeff的MSDN链接进行了更改:

代码语言:javascript
复制
XmlWriterSettings set = new XmlWriterSettings();
set.Indent = true;
set.IndentChars = "\t";
set.Encoding = Encoding.UTF8;

xw = XmlWriter.Create(f, set);

这不会改变最终结果。

现在,我的XmlWriter中有一个任意的深度,我从其他地方(我无法控制)获得一个XML字符串,它是一个单行的、无缩进的XML。如果我调用xw.WriteRaw(),那么这个字符串将被逐字注入,并且不会跟随我想要的缩进。

代码语言:javascript
复制
...
string xml = ExternalMethod();
xw.WriteRaw(xml);
...

本质上,我想要一个解析XML字符串并遍历所有WriteStartElement等的WriteRaw,这样它就可以根据XmlTextWriter的设置重新格式化。

我的首选方法是使用已有的设置来执行此操作,并且不必重新加载最终的XML来重新格式化它。我也不希望用XmlReader这样的东西解析XML字符串,然后在我的XmlWriter中模拟它找到的东西(非常非常手动的过程)。

最后,我宁愿有一个简单的解决方案,而不是遵循我的偏好的解决方案。(最好的解决方案自然会很简单,并且符合我的喜好。)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-13 16:05:50

如何使用XmlReader将xml读取为xml节点?

代码语言:javascript
复制
string xml = ExternalMethod();
XmlReader reader =  XmlReader.Create(new StringReader(xml));
xw.WriteNode(reader, true);
票数 30
EN

Stack Overflow用户

发布于 2009-05-13 15:45:01

到目前为止,这是我得到的最好的。这是一个非常手动的过程,只支持所编写的内容。我的字符串XML只不过是标签、属性和文本数据。如果它支持命名空间、CDATA等,那么它必须相应地增长。

非常手工,非常混乱,很容易出现bug,但它确实满足了我的偏好。

代码语言:javascript
复制
private static void PipeXMLIntoWriter(XmlWriter xw, string xml)
{
    byte[] dat = new System.Text.UTF8Encoding().GetBytes(xml);
    MemoryStream m = new MemoryStream();
    m.Write(dat, 0, dat.Length);
    m.Seek(0, SeekOrigin.Begin);
    XmlReader r = XmlReader.Create(m);

    while (r.Read())
    {
        switch (r.NodeType)
        {
            case XmlNodeType.Element:
                xw.WriteStartElement(r.Name);

                if (r.HasAttributes)
                {
                    for (int i = 0; i < r.AttributeCount; i++)
                    {
                        r.MoveToAttribute(i);
                        xw.WriteAttributeString(r.Name, r.Value);
                    }
                }

                if (r.IsEmptyElement)
                {
                    xw.WriteEndElement();
                }
                break;
            case XmlNodeType.EndElement:
                xw.WriteEndElement();
                break;
            case XmlNodeType.Text:
                xw.WriteString(r.Value);
                break;

            default:
                throw new Exception("Unrecognized node type: " + r.NodeType);
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2011-08-10 22:55:34

综合上面的答案,我找到了这个作品:

代码语言:javascript
复制
private static string FormatXML(string unformattedXml) {
    // first read the xml ignoring whitespace
    XmlReaderSettings readeroptions= new XmlReaderSettings {IgnoreWhitespace = true};
    XmlReader reader = XmlReader.Create(new StringReader(unformattedXml),readeroptions);

    // then write it out with indentation
    StringBuilder sb = new StringBuilder();
    XmlWriterSettings xmlSettingsWithIndentation = new XmlWriterSettings { Indent = true};                       
    using (XmlWriter writer = XmlWriter.Create(sb, xmlSettingsWithIndentation)) {
        writer.WriteNode(reader, true);
    }

    return sb.ToString();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/858630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档