10

XmlWriterSettings を使用して Xml をファイルに書き込みます。属性のみを持つ要素があり、子はありません。私はそれらを次のように出力したい:

<element a="1" /> 

それ以外の

<element a="1"></element>

XmlWriterSettings でできますか?

編集:

コードは次のとおりです。

private void Mission_Save(string fileName)
    {
        StreamWriter streamWriter = new StreamWriter(fileName, false);
        streamWriter.Write(Mission_ToXml());
        streamWriter.Close();
        streamWriter.Dispose();

        _MissionFilePath = fileName;
    }

private string Mission_ToXml()
    {
        XmlDocument xDoc;
        XmlElement root;
        XmlAttribute xAtt;

        xDoc = new XmlDocument();

        foreach (string item in _MissionCommentsBefore)
            xDoc.AppendChild(xDoc.CreateComment(item));

        root = xDoc.CreateElement("mission_data");
        xAtt = xDoc.CreateAttribute("version");
        xAtt.Value = "1.61";
        root.Attributes.Append(xAtt); 
        xDoc.AppendChild(root);

        //Out the xml's!
        foreach (TreeNode node in _FM_tve_Mission.Nodes)
            Mission_ToXml_private_RecursivelyOut(root, xDoc, node);

        foreach (string item in _MissionCommentsAfter)
            xDoc.AppendChild(xDoc.CreateComment(item));


        //Make this look good
        StringBuilder sb = new StringBuilder();
        XmlWriterSettings settings = new XmlWriterSettings();

        settings.Indent = true;
        settings.IndentChars = "  ";
        settings.NewLineChars = "\r\n";
        settings.NewLineHandling = NewLineHandling.Replace;
        settings.OmitXmlDeclaration = true;
        using (XmlWriter writer = XmlWriter.Create(sb, settings))
        {
            xDoc.Save(writer);
        }

        return sb.ToString();
    }

private void Mission_ToXml_private_RecursivelyOut(XmlNode root, XmlDocument xDoc, TreeNode tNode)
    {
        root.AppendChild(((MissionNode)tNode.Tag).ToXml(xDoc));
        foreach (TreeNode node in tNode.Nodes)
            Mission_ToXml_private_RecursivelyOut(root, xDoc, node);
    }

ここで _FM_tve_Mission はノードを持つ TreeView コントロールであり、各ノードにはクラス MissionNode のタグがあり、xml に変換されたこの MissionNode を含む XmlNode を返す ToXml メソッドがあります

4

3 に答える 3

10

そのための特別な設定は必要ありません。

XmlWriter output = XmlWriter.Create(filepath);
 output.writeStartElement("element");
 output.writeAttributeString("a", "1");
 output.writeEndElement();

これにより、次の出力が得られます<element a="1" />(xmlの作成に取り組んでいるアプリケーションでテストしました)

基本的に、最後の要素を書き込む前にデータを追加しないと、終了するだけです。

またXmlWriterSettings、デフォルトで機能しない場合は、次のいずれかである可能性があります。

XmlWriterSettings wSettings = new XmlWriterSettings();
wSettings.Indent = true;
wSettings.ConformanceLevel = ConformanceLevel.Fragment;
wSettings.OmitXmlDeclaration = true;
XmlWriter output = XmlWriter.Create(filePathXml, wSettings);
于 2012-04-06T19:02:38.540 に答える
2

外部ファイルから XML を処理して、空でない閉じた要素を取り除くために次のクラスを作成しました。XML に自己終了タグが含まれるようになりました。

using System.Linq;
using System.Xml.Linq;

namespace XmlBeautifier
{
    public class XmlBeautifier
    {
        public static string BeautifyXml(string outerXml)
        {
            var _elementOriginalXml = XElement.Parse(outerXml);
            var _beautifiedXml = CloneElement(_elementOriginalXml);
            return _beautifiedXml.ToString();
        }

        public static XElement CloneElement(XElement element)
        {
            // http://blogs.msdn.com/b/ericwhite/archive/2009/07/08/empty-elements-and-self-closing-tags.aspx
            return new XElement(element.Name,
                element.Attributes(),
                element.Nodes().Select(n =>
                {
                    XElement e = n as XElement;
                    if (e != null)
                        return CloneElement(e);
                    return n;
                })
            );
        }

    }
}
于 2015-06-09T11:25:17.500 に答える
-1

正規表現と再帰的な方法で、それは簡単な仕事です:

    using System.Xml.Linq;
    public static class Xml
    {
        /// <summary>
        /// Recursive method to shorten all xml end tags starting from a given element, and running through all sub elements 
        /// </summary>
        /// <param name="elem">Starting point element</param>
        public static void ToShortEndTags(this XElement elem)
        {
            if (elem == null) return;

            if (elem.HasElements)
            {
                foreach (var item in elem.Elements()) ToShortEndTags(item);
                return;
            }

            var reduced = Regex.Replace(elem.ToString(), ">[\\s\\n\\r]*</\\w+>", "/>");

            elem.ReplaceWith(XElement.Parse(reduced));
        }
    }

それを使用するには、次のように入力します。

    var path = @"C:\SomeFile.xml";
    var xdoc = XDocument.Load(path).Root.ToShortEndTags();

xdoc現在、XDocument指定されたパスからロードされたインスタンスですが、その適格な (コンテンツのない)完全な終了タグはすべて短縮されています

于 2016-10-27T09:39:43.523 に答える