2017-08-08 15 views
1

次のタグにXMLファイルに書きたいと思います。C#XmlWriter WriteStartAttribute

「トークンStartAttributeステータス文書内につながる:私は

XmlWriterSettings settings = new XmlWriterSettings 
{ 
    Indent = true, 
    IndentChars = "\t" 
    CheckCharacters = false, 
}; 

XmlWriter xmlWriter = XmlWriter.Create (filename, settings); 

xmlWriter.WriteStartDocument(); 
xmlWriter.WriteStartAttribute ("xsi", "schemaLocation", "MSD"); 
xmlWriter.WriteStartAttribute ("xmlns", "MSD"); 
xmlWriter.WriteStartAttribute ("xmlns", "xsi", "http://www.w3.org/2001/XMLSchema-instance"); 

次しかしWriteStartAttributeの最初の呼び出しの後、私は次の例外を得ないこれらのための

<StructureMetaData xsi:schemaLocation="MSD" xmlns="MSD" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <!-- here a following more tags --> 
</StructureMetaData> 

無効なXML文書です。

どのようにこれらの属性をxmlタグに書き込むことができますか?

答えて

0

あなたは属性が書かれているに開始要素記述する必要があるとしている:XML LINQを使用する方が簡単です

xmlWriter.WritestartElement("StructureMetaData"); 
xmlWriter.WriteStartAttribute(...); 
0

を:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication72 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string root = "<StructureMetaData xsi:schemaLocation=\"MSD\" xmlns=\"MSD\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"></StructureMetaData>"; 

      XDocument doc = XDocument.Parse(root); 
      XElement metaData = doc.Root; 
      XNamespace ns = metaData.GetDefaultNamespace(); 

      metaData.Add(new XElement(ns + "ABC", new object[] { 
       new XElement(ns + "DEF", new object[] { 
        new XAttribute("rst","abc"), 
        123}), 
       new XElement(ns + "GHI", new object[] { 
        new XAttribute("uvw","def"),      
        456}), 
       new XElement(ns + "JKL", new object[] { 
        new XAttribute("xyz","ghi"), 
        789}) 
      })); 

      doc.Save("filename"); 
     } 
    } 
} 
+0

ありがとうございます。しかし、サブアイテムにはxmlの問題があります。 ABC 123 456 789 私はLINQのでXMLファイルを生成する方法を読みます。各XElementにはxmlns属性があります。 – Holgis

+0

コードを更新しました。 – jdweng

0

あなたは、いくつかを持っています問題:

  1. あなたはroot elementタg <StructureMetaData最初ののいずれかの属性を書き始める前に、デフォルトネームスペースxmlns="MSD"があるので、その名前空間に記述する必要があります。

  2. あなたはXmlWriter.WriteStartAttribute()を呼び出していますが、このメソッドは属性の名前のみを書き込みます。あなたはまだ、例えば、XmlWriter.WriteString()を使用して名前の後を記述する必要があります。また、XmlWriter.WriteAttributeString()を1回呼び出すだけで、名前と値を書き込むこともできます。

  3. xmlWriterを閉じて、usingステートメントで処分する必要があります。

    using (var xmlWriter = XmlWriter.Create(filename, settings)) 
    { 
        xmlWriter.WriteStartDocument(); 
    
        var rootNamespace = "MSD"; 
    
        // Write the root element in the MSD namespace 
        xmlWriter.WriteStartElement("StructureMetaData", rootNamespace); 
    
        // Write the root element's attribute names and values 
        xmlWriter.WriteStartAttribute("xsi", "schemaLocation", "http://www.w3.org/2001/XMLSchema-instance"); 
        xmlWriter.WriteString("MSD"); 
        xmlWriter.WriteStartAttribute("xmlns"); 
        xmlWriter.WriteString(rootNamespace); 
        xmlWriter.WriteStartAttribute("xmlns", "xsi", null); 
        xmlWriter.WriteString("http://www.w3.org/2001/XMLSchema-instance"); 
    
        // Write the root element contents 
    
        // Close the root element 
        xmlWriter.WriteEndElement(); 
    
        // Close the document 
        xmlWriter.WriteEndDocument(); 
    } 
    

    そしてWriteAttributeString()を使用して簡単なバージョン:

    using (var xmlWriter = XmlWriter.Create(filename, settings)) 
    { 
        xmlWriter.WriteStartDocument(); 
    
        var rootNamespace = "MSD"; 
    
        // Write the root element in the MSD namespace 
        xmlWriter.WriteStartElement("StructureMetaData", rootNamespace); 
    
        // Write the root element's attribute names and values 
        xmlWriter.WriteAttributeString("xsi", "schemaLocation", "http://www.w3.org/2001/XMLSchema-instance", "MSD"); 
        xmlWriter.WriteAttributeString("xmlns", rootNamespace); 
        xmlWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); 
    
        // Write the root element contents 
    
        // Close the root element 
        xmlWriter.WriteEndElement(); 
    
        // Close the document 
        xmlWriter.WriteEndDocument(); 
    } 
    

    サンプル.Net fiddle両方のオプションを示す。ここ

WriteStartAttribute()を使用してコードの作業バージョンです。

+0

ありがとう、今は動作します。私はWriteAttributeStringによって2つ以上の引数にいくつか問題がありました – Holgis

+0

@Holgis - あなたは大歓迎です。質問に答えるには、[それをそのようにマークする](https://meta.stackexchange.com/q/147531)を実行してください。 – dbc

関連する問題