0

XMLライターが次のように食べたときに終了タグを書き出さない理由を誰か教えてください:/ >

私がやっていることは、xml ファイルを読み取ってから新しいファイルに書き込むことです。特定の要素が見つかった場合は、いくつかのコードを実行し、新しい要素で要素をオーバーライドします。全体の目的は、最初のドキュメントのほとんどすべての xml をコピーすることです。ただし、ライターが追加する新しい要素を出力する別のコードを実行する必要がある特定の要素が見つかった場合を除きます。これまでのところ、終了タグを除いて、ほぼ正常に動作しています。

これがどのように見えるかのスニペットです(アスタリスクで示されている違いの例):

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{57900E99-A405-49F4-83B2-0254117D041B}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>libprojex</RootNamespace>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" **/>**
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <CharacterSet>MultiByte</CharacterSet>
    **<PlatformToolset>v110</PlatformToolset>**
  </PropertyGroup>

ここに私の出力があります:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{57900E99-A405-49F4-83B2-0254117D041B}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>libprojex</RootNamespace>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props">
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      <ConfigurationType>DynamicLibrary</ConfigurationType>
      <UseDebugLibraries>true</UseDebugLibraries>
      <CharacterSet>MultiByte</CharacterSet>
    </PropertyGroup>

これらは短い抜粋です。それらはドキュメント全体で続きます。で終わる行に気付いた場合/>、ライターに適切に追加されません。また、この行は出力にありません<PlatformToolset>v110</PlatformToolset>

これを達成する方法を示すコードをいくつか含めました。

string vcName = Path.GetFileName(textBox1.Text);
string vcProj = Path.Combine(baseDir, vcName);

using (XmlReader reader = XmlReader.Create(textBox1.Text))
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.ConformanceLevel = ConformanceLevel.Auto;
    settings.Indent = true;
    settings.CloseOutput = false;
    string nameSpace = "http://schemas.microsoft.com/developer/msbuild/2003";
    using (XmlWriter writer = XmlWriter.Create(vcProj, settings))
    {

        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:

                   if (reader.Name == "ClInclude")
                    {
                        //execute code here- omitted for example
                        writer.WriteStartElement(reader.Name, nameSpace);
                        writer.WriteAttributeString("Include", "include/" + filename);
                        writer.WriteEndElement();

                    }
                    else if (reader.Name == "ClCompile" && reader.HasAttributes)
                    {
                        //execute code here- omitted for example
                        writer.WriteStartElement(reader.Name, nameSpace);
                        writer.WriteAttributeString("Include", "src/" + filename);
                        writer.WriteEndElement();

                    } 
                   else
                    {
                        writer.WriteStartElement(reader.Name, nameSpace);
                        writer.WriteAttributes(reader, true);
                    }

                    break;

                case XmlNodeType.Text:
                    writer.WriteString(reader.Value);
                    break;
                case XmlNodeType.XmlDeclaration:
                case XmlNodeType.ProcessingInstruction:
                    writer.WriteProcessingInstruction(reader.Name, reader.Value);
                    break;
                case XmlNodeType.Comment:
                    writer.WriteComment(reader.Value);
                    break;
                case XmlNodeType.Attribute:
                    writer.WriteAttributes(reader, true);
                    break;
                case XmlNodeType.EntityReference:
                    writer.WriteEntityRef(reader.Value);
                    break;
               case XmlNodeType.EndElement:
                    writer.WriteFullEndElement();
                    break;

                }
        }

    }

なぜ私がこれらの問題を抱えているのか教えてもらえますか?無効な XML を何らかの形で無視しているのでしょうか?

4

2 に答える 2