【问题标题】:Remove special case indentation in XML files删除 XML 文件中的特殊情况缩进
【发布时间】:2012-05-18 09:45:09
【问题描述】:

我想修改一个 XML 文件,但棘手的部分是我添加的信息应该具有最少的格式。我一直在寻找一段时间,我似乎无法找到答案。这是 XML 当前的样子(原始):

<?xml version="1.0" encoding="utf-8"?>
<doe-jane>
  <name>Jane Doe</name>
  <contact>North Pole

Tel: (555) 123-4567
jane.doe@abc.com
</contact>
  <coveragelist>
    <company>Comp1</company>
    <company>Comp2</company>
  </coveragelist>
</doe-jane>

它必须看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<doe-jane>
  <name>Jane Doe</name>
  <contact>North Pole

Tel: (555) 123-4567
jane.doe@abc.com
</contact>
--> // Change needs to happen from here on <--
<coveragelist><company>Comp1</company>
<company>Comp2</company>
</coveragelist>
</doe-jane>

到目前为止,这是我的代码:

XmlDocument d = new XmlDocument();
//XmlTextWriter wr = new XmlTextWriter(resAnXFile, Encoding.UTF8);
//wr.Formatting = Formatting.None;
d.Load(resAnXFile);
XmlNode t = d.SelectSingleNode("//coveragelist");
t.ParentNode.RemoveChild(t);
// create CoverageList node
XmlNode coverageListNode = d.CreateNode(XmlNodeType.Element, "coveragelist", null);
foreach (var company in dataList)
{
    // create company nodes
    XmlNode companyNode = d.CreateElement("company");
    companyNode.InnerText = company.CompanyName.ToString();
    coverageListNode.AppendChild(companyNode);
}
d.DocumentElement.AppendChild(coverageListNode);
d.Save(resAnXFile);

我已经尝试过 XMLTextWriter,但我没有任何运气。非常感谢任何帮助。

提前谢谢你。

【问题讨论】:

  • --&gt; // Change needs to happen from here on &lt;-- 什么样的变化?删除格式?为什么在那个时候?
  • @L.B 是的,特殊格式应该从那时开始发生。在那之前,我们的第 3 方应用程序在所有方面都没有问题。其余的都有问题。因此,我的请求。

标签: c# xml c#-4.0 xmldocument xmltextwriter


【解决方案1】:

我对你的要求有点困惑,但我的理解是这部分:

Comp1 Comp2

是新部分,您希望它没有缩进并且第一家公司与起始“coveragelist”节点在同一行吗?

我知道你说过你试过 XmlTextWriter,但你试过了吗:

xmlTextWriter.Formatting = xmlTextWriter.Formatting.None

xmlTextWriter.WriteString("\n");

你需要去哪里?

【讨论】:

  • 虽然我同意 Henk 和 L.B.那个空格在 XML 中真的不应该是什么大问题。如果是,你应该重新调查你在做什么。
  • 是的,@trycatch。这正是我需要的。我需要与“coveragelist”节点位于同一行的第一家公司。为了回答您关于空白的评论,第三方应用程序对空白非常敏感,因此我必须删除它们。无论如何,我尝试了你的建议,我得到了:System.NullReferenceException: Object reference not set to an instance of an object.
  • 我的建议不是完整的代码,它只是向您展示您可以在 xmlTextWriter 上设置的函数和属性,这将帮助您生成所需的结果。 nullreferenceexception 表示您没有在某处进行初始化。也许声明了一个没有“= new XmlTextWriter()”的 XmlTextWriter?
【解决方案2】:

如果您打算删除格式

StringWriter wr = new StringWriter();
XDocument xDoc = XDocument.Load(.....);
xDoc.Save(wr, SaveOptions.DisableFormatting);
var newXml = wr.ToString();

【讨论】:

  • 我收到错误:Save 的重载方法不接受 2 个参数。以下是我正在使用的命名空间: using System;使用 System.Collections.Generic;使用 System.Linq;。是否有我缺少或我应该删除的命名空间?使用 System.Text;使用 System.Xml;使用 System.Xml.Xsl;使用 System.Xml.XPath;使用 System.Xml.Linq;使用 System.IO;
  • @inquisitive_one System System.IOSystem.Xml.Linq 对于这段代码就足够了。
【解决方案3】:

感谢大家的建议。在您的帮助下,我想出了这个解决方案:

// Open up the same file and remove xml auto-formatting
XmlReader reader = XmlReader.Create(readFileName);
XmlTextWriter writer = new XmlTextWriter(writeFileName, null);
while (reader.Read())
{
switch (reader.NodeType)
{
    case XmlNodeType.Element:
        // if 1st node after openening tag is analyst name then setup a linefeed
        if (reader.Name.Equals(Path.GetFileNameWithoutExtension(readerFileName)))
        {
            writer.WriteStartElement(reader.Name);
            writer.WriteString("\r\n");
        }
        else
        {
            // setup linefeed after every element
            writer.WriteStartElement(reader.Name);
            writer.WriteAttributes(reader, true);
            if (reader.IsEmptyElement)
            {
                writer.WriteEndElement();
                writer.WriteString("\r\n");
            }
        }
        break;

    case XmlNodeType.Text:
        writer.WriteString(reader.Value);
        break;

    case XmlNodeType.EndElement:
        writer.WriteEndElement();
        break;

    // handles opening xml tag
    case XmlNodeType.XmlDeclaration:
    case XmlNodeType.ProcessingInstruction:
        writer.WriteProcessingInstruction(reader.Name, reader.Value);
        writer.WriteString("\r\n");
        break;
}
}
// close reader & writer
writer.Flush();
reader.Close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多