2

既存の 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>

それを読み込んで更新し、いくつかのプロパティを追加します。例えば:

TestName1 プロパティが更新されました。TestName 2 プロパティはそのままです。

TestPropertySet2 では、いくつかの新しいプロパティを追加しています。

すべての操作後のドキュメントの出力は次のとおりです。

<?xml version="1.0" encoding="utf-16"?>
<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>

これは、ドキュメントの読み込みと操作に使用したコードです。

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 プロパティが 2 つの行にあることです。

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

1 に答える 1

4

ReaderCreator()あなたのandOutputCreator()メソッドが何をするのかわかりません。しかし、次のコードは、要求どおりに私の側で機能します。

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();

これにより、次の出力が生成されます (インデントは維持されます)。

<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>

XmlWriterの代わりに を使用しないでくださいXmlTextWriter。それがあなたの問題の理由かどうかはわかりません。このコードは、特定の実装に簡単に適応させることができます。

于 2013-11-14T21:01:21.140 に答える