Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用制表符格式化XElement_C#_Linq To Xml - Fatal编程技术网

C# 使用制表符格式化XElement

C# 使用制表符格式化XElement,c#,linq-to-xml,C#,Linq To Xml,我有一个现有的xml文档: <?xml version="1.0" encoding="utf-16"?> <property_set_list> <property_set symbol_id="TestPropertySet1"> <property symbol_id="TestName1" id="1" type="8">Test</property> <property symbo

我有一个现有的xml文档:

<?xml version="1.0" encoding="utf-16"?>
<property_set_list>
    <property_set symbol_id="TestPropertySet1">
        <property symbol_id="TestName1" id="1" type="8">Test</property>
        <property symbol_id="TestName2" id="2" type="8"></property>
    </property_set>
    <property_set symbol_id="TestPropertySet2">

    </property_set>
</property_set_list>
using (var reader = ReaderCreator())
            using (var output = OutputCreator())
            using (var xmlWriter = new XmlTextWriter(output))
            {
                xmlWriter.Indentation = 1;
                xmlWriter.Formatting = Formatting.Indented;
                xmlWriter.IndentChar = TAB;

                XDoc = XElement.Load(reader, LoadOptions.None);
                Namespace = "some namespace";

               // some code to update properties


                // adds new nodes to TestPropertySet2
                foreach (var localeId in _franchise.LocaleIds)
                {
                    TestPropertySet2.Add(
                        new XElement(
                            Namespace + "property", localeId,
                            new XAttribute("symbol_id", "localeID"),
                            new XAttribute("id", i),
                            new XAttribute("type", "19")
                        )
                    );
                    i++;
                }

                XDoc.Save(xmlWriter);
            }
问题是TestName2属性现在位于两行上:

<property symbol_id="TestName2" id="1" type="8">
            </property>

我不知道你的
ReaderCreator()
OutputCreator()
方法做什么。但是下面的代码在我这边按要求工作

string xml = "<property_set_list><property_set symbol_id=\"TestPropertySet1\"><property symbol_id=\"TestName1\" id=\"1\" type=\"8\">qwerty</property>" +
    "<property symbol_id=\"TestName2\" id=\"1\" type=\"8\"></property></property_set><property_set symbol_id=\"TestPropertySet2\">" +
    "<property symbol_id=\"localeID\" id=\"1\" type=\"19\">1033</property><property symbol_id=\"localeID\" id=\"2\" type=\"19\">1079</property></property_set></property_set_list>";

XElement xdoc = XElement.Parse(xml);
XElement TestPropertySet2 = xdoc.Elements()
    .Where(x => x.Attribute("symbol_id").Value == "TestPropertySet2")
    .FirstOrDefault();

TestPropertySet2.Add(
    new XElement(
       "property", "locale_id_val",
       new XAttribute("symbol_id", "localeID"),
       new XAttribute("id", "99"),
       new XAttribute("type", "19")
       ));

XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
xws.IndentChars = "\t\t";

FileStream fs = new FileStream("test.xml", FileMode.Create);
using (XmlWriter xw = XmlWriter.Create(fs, xws))
{
     xdoc.Save(xw);
}
fs.Close();
string xml=“qwerty”+
"" +
"10331079";
XElement xdoc=XElement.Parse(xml);
XElement TestPropertySet2=xdoc.Elements()
其中(x=>x.Attribute(“symbol_id”).Value==“TestPropertySet2”)
.FirstOrDefault();
TestPropertySet2.Add(
新元素(
“属性”、“区域设置\u id\u val”,
新XAttribute(“symbol_id”、“localeID”),
新的X属性(“id”、“99”),
新特性(“类型”、“19”)
));
XmlWriterSettings xws=新的XmlWriterSettings();
xws.Indent=true;
xws.IndentChars=“\t\t”;
FileStream fs=newfilestream(“test.xml”,FileMode.Create);
使用(xmlwriterxw=XmlWriter.Create(fs,xws))
{
xdoc.Save(xw);
}
fs.Close();
这将产生以下输出(保留缩进):


qwerty
1033
1079
区域设置\u id\u val


请不要使用
XmlWriter
而不是
xmltextwitter
。我不知道这是否是你问题的原因。这段代码可以很容易地适应您的特定实现。

我不知道您的
ReaderCreator()
OutputCreator()
方法做什么。但是下面的代码在我这边按要求工作

string xml = "<property_set_list><property_set symbol_id=\"TestPropertySet1\"><property symbol_id=\"TestName1\" id=\"1\" type=\"8\">qwerty</property>" +
    "<property symbol_id=\"TestName2\" id=\"1\" type=\"8\"></property></property_set><property_set symbol_id=\"TestPropertySet2\">" +
    "<property symbol_id=\"localeID\" id=\"1\" type=\"19\">1033</property><property symbol_id=\"localeID\" id=\"2\" type=\"19\">1079</property></property_set></property_set_list>";

XElement xdoc = XElement.Parse(xml);
XElement TestPropertySet2 = xdoc.Elements()
    .Where(x => x.Attribute("symbol_id").Value == "TestPropertySet2")
    .FirstOrDefault();

TestPropertySet2.Add(
    new XElement(
       "property", "locale_id_val",
       new XAttribute("symbol_id", "localeID"),
       new XAttribute("id", "99"),
       new XAttribute("type", "19")
       ));

XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
xws.IndentChars = "\t\t";

FileStream fs = new FileStream("test.xml", FileMode.Create);
using (XmlWriter xw = XmlWriter.Create(fs, xws))
{
     xdoc.Save(xw);
}
fs.Close();
string xml=“qwerty”+
"" +
"10331079";
XElement xdoc=XElement.Parse(xml);
XElement TestPropertySet2=xdoc.Elements()
其中(x=>x.Attribute(“symbol_id”).Value==“TestPropertySet2”)
.FirstOrDefault();
TestPropertySet2.Add(
新元素(
“属性”、“区域设置\u id\u val”,
新XAttribute(“symbol_id”、“localeID”),
新的X属性(“id”、“99”),
新特性(“类型”、“19”)
));
XmlWriterSettings xws=新的XmlWriterSettings();
xws.Indent=true;
xws.IndentChars=“\t\t”;
FileStream fs=newfilestream(“test.xml”,FileMode.Create);
使用(xmlwriterxw=XmlWriter.Create(fs,xws))
{
xdoc.Save(xw);
}
fs.Close();
这将产生以下输出(保留缩进):


qwerty
1033
1079
区域设置\u id\u val


请不要使用
XmlWriter
而不是
xmltextwitter
。我不知道这是否是你问题的原因。此代码可以很容易地根据您的特定实现进行调整。

根据您希望最终XML的外观,您可以使用保存,并将
缩进字符设置为
\t\t
。但是,这将使用双制表符缩进整个文档。我不知道您是否可以以不同的方式缩进不同的部分(无需编写
XmlWriter
)。您还需要在
XmlWriterSettings
上设置
Indent=true
。我已经在我的电脑上测试过了,它从不拆分
标签。如果你能将保存到文件中的部分(全部)发布,也许会有所帮助。我已经更新了全部内容。希望现在更清楚。谢谢根据您希望最终XML的外观,您可以使用,并将
IndentChars
设置为
\t\t
保存它。但是,这将使用双制表符缩进整个文档。我不知道您是否可以以不同的方式缩进不同的部分(无需编写
XmlWriter
)。您还需要在
XmlWriterSettings
上设置
Indent=true
。我已经在我的电脑上测试过了,它从不拆分
标签。如果你能将保存到文件中的部分(全部)发布,也许会有所帮助。我已经更新了全部内容。希望现在更清楚。谢谢谢谢你,安德烈!成功了!我所做的唯一更改是将XmlTextWriter替换为XMLWriter。作为记录,ReaderCreator()和OutputCreator()是返回TextReader和TextWriter的委托。这有助于单元测试模块。@Mdb,很高兴我能提供帮助。谢谢你,Andrei!成功了!我所做的唯一更改是将XmlTextWriter替换为XMLWriter。作为记录,ReaderCreator()和OutputCreator()是返回TextReader和TextWriter的委托。这有助于对模块进行单元测试。@Mdb,很高兴我能提供帮助。
<property_set_list>
    <property_set symbol_id="TestPropertySet1">
            <property symbol_id="TestName1" id="1" type="8">qwerty</property>
            <property symbol_id="TestName2" id="1" type="8"></property>
    </property_set>
    <property_set symbol_id="TestPropertySet2">
            <property symbol_id="localeID" id="1" type="19">1033</property>
            <property symbol_id="localeID" id="2" type="19">1079</property>
            <property symbol_id="localeID" id="99" type="19">locale_id_val</property>
    </property_set>