2012-04-30 5 views
0

私はこれを動作させるのに恐ろしい時間があります。私は既存のXMLファイルを持っているので、xmlns = "http://url.com/path_v1_0"を既存のタグに追加するだけで済みます(url.comは任意です。代わりに入れたいものがあります) 。これはC#で行う必要があります。ファイルの残りの部分はそのままで、xmlns部分を追加する必要があります。ここでC#のxmlファイルにxmlns = "http://url.com"だけを追加するには?

は、私が持っているものの抜粋です:ここ

<?xml version="1.0" encoding="utf-8"?> 
<content> 
    <block id="root"> 
    <identification> 

は私が必要なものの抜粋です:

<?xml version="1.0" encoding="utf-8"?> 
<content xmlns="http://url.com/path_v1_0"> 
    <block id="root"> 
    <identification> 
+0

これは任意の入力に対して機能する必要がありますか、変換する既知のファイルの固定セットがありますか? – dtb

+0

これは、任意のリスト内の任意のファイルに追加するために必要です。すべてのファイルは同じ形式で、同じタグを持ちます。 – user1366062

+0

今日、どのようにXMLを制作していますか?例えば、http://stackoverflow.com/questions/443250/creating-a-specific-xml-document-using-namespaces-in-c-sharp – erikxiv

答えて

1

あなたが特定の形式で常に出力XMLを、あなたはおそらく、単にいくつかの文字列操作を実行して逃げることができますツールによって生成されたXMLを扱っているので:

var prefix = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<content>"; 

var xml = File.ReadAllText(pathToXmlFile); 

if (!xml.StartsWith(prefix)) 
{ 
    throw new Exception("Wrong format"); 
} 

xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" + 
     "<content xmlns=\"http://url.com/path_v1_0\">" + 
     xml.Substring(prefix.Length); 

File.WriteAllText(pathToXmlFile, xml); 
0

あなたはHERESに少し例をLinq2XMLを試して喜んでいる場合は、次の

XDocument doc = XDocument.Load("path/to/file.xml"); 
doc.Root.Attribute("xmlns").Value = "http://url.com/path_v1_0"; 

using System.Xml.Linq; 

// EDIT:すでにxmlns属性を持つ既存のXMLファイルで試してみました。だからdtbが正しい。ここでは作業例です:

XDocument oldDoc = XDocument.Load(@"c:\logs\asd.xml"); 
XNamespace ns = "http://url.com/path_v1_0"; 
XElement newRoot = new XElement(ns + oldDoc.Root.Name.LocalName, oldDoc.Root.Descendants()); 
XDocument newDoc = new XDocument(newRoot); 
+0

これは動作しません。 'doc.Root.Attribute(" xmlns ")'は 'null'を返します。 'doc.Root 'に変更した場合。追加(新しいXAttribute( "xmlns"、 "http:// ...")); '例外がスローされます: "プレフィックス'を 'から' http:// ... 'に再定義することはできません同じ開始要素タグ。 – dtb

+0

これはうまくいきません。再帰的にドキュメント内のすべての要素に名前空間を追加しないと、 ' ...'になります。 – dtb

+0

もう一つの事実は気付かなかった。ありがとうございました。私はまったくこの問題に遭遇したことはありません。 – csteinmueller

0

public static void SetDefaultXmlNamespace(XElement element, XNamespace xmlns) 
    { 
     if (element.Name.NamespaceName == string.Empty) 
      element.Name = xmlns + element.Name.LocalName; 

     foreach (var e in element.Elements()) 
      SetDefaultXmlNamespace(element, xmlns); 
    } 

は以下のようにそれを呼び出してXMLに名前空間を設定するには、このルーチンを使用し

すべての私の頭の上にジャンプするXMLの狂信者を有する危険で[OK]を
XDocument doc = XDocument.Load(xmlfilepath); 
SetDefaultXmlNamespace(doc.Root, "http://url.com/path_v1_0"); 
1

次のように、これを行う最も簡単な方法は次のとおりです。

TextReader myInputFile = new StreamReader("test.xml"); 
    TextWriter myOutputFile = new StreamWriter("newtest.xml"); 

    myOutputFile.WriteLine(myInputFile.ReadLine()); 
    myOutputFile.WriteLine("<content xmlns=\"http://url.com/path_v1_0\">"); 

    string line = myInputFile.ReadLine(); // Waste the original <content> line 

    while ((line = myInputFile.ReadLine()) != null) 
    { 
    myOutputFile.WriteLine(line); 
    } 

    myInputFile.Close(); 
    myOutputFile.Close(); 

今私が言うように、これは絶対に正しいXML標準ではありませんそれを行うにはいくつかの潜在的な問題がありますが、あなたが新しい行を追加したときにUTF-8形式の文字列を追加しない可能性が最も高いでしょう。

おそらく最も速くて簡単です.NETが提供する様々な異なるXML APIすべてに縛られることなく理解することができます。

"正しい"方法を得たい場合は、XDocument & XElementのドキュメントを参照する必要があります.Linyq to XMLとこれらのクラスのさまざまなメソッドを使用すると、XMLNSタグ指定された要素に続けてXMLを保存します。

関連する問題