2012-01-25 58 views
17

默認情況下,我們是否可以強制XmlWriter發出<my-tag></my-tag>而不是<my-tag/>?

someXmlWriter.WriteElementString("my-tag", someString); 

產生<my-tag />

我環顧四周XmlWriterSettings類,這將迫使作家產生<my-tag></my-tag>代替,但沒有發現任何可能的選擇。

是否有一種簡單的方式強制XmlWriter發佈帶有「開放標籤,關閉標籤」的空元素而不是短格式?

編輯
是的!我認識到,關於XML有效性,這兩個表示法是等價的,有效的和所有......然而,我正在使用Read()(即在節點級別(!))解析此類XML的遺留代碼,並且通過Read () - 當在一個空節點...

因此,我的問題來限制對這個遺留代碼的變化量的上下文。這個問題確實與建議的this SO question重疊;然而,這裏提供的選項並不容易適用於我的情況。

+0

爲什麼?它們是等價的。 – Quentin

+1

可能重複的[C#:XmlTextWriter.WriteElementString失敗空字符串?](http://stackoverflow.com/questions/1176202/c-xmltextwriter-writeelementstring-fails-on-empty-strings) – nemesv

+0

您可以在這裏找到一個解決方案: http://stackoverflow.com/questions/13389960/how-to-use-xmlwritersettings-when-using-override-void-writeendelement 這是爲我工作。 – Portekoi

回答

-11

在.Net中沒有選項設置。它們是相同的,任何解析器都應該能夠處理有效的XML。

+0

't總是比較容易證明某物存在,而不是某物不存在;-)。您是否確定沒有類似的方法來強制XmlWriter生成空元素的一種或另一種形式? (即以全局方式,而不是WriteStart/WriteEndElement的技巧)。你知道MS或其他權威人士會證實這一點嗎? – mjv

+1

@mjv是的。 http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.xmlwritersettings.aspx上週我對它進行了廣泛的研究,因爲我們處理的一些中間件在翻譯期間窒息了自閉標籤。唯一的解決辦法是按照已經指出的方法編寫自己的方法。 http://blogs.msdn.com/b/ericwhite/archive/2009/07/08/empty-elements-and-self-closing-tags.aspx –

+0

-1因爲它們不是xhtml中的同一件事物(這是XML)。如果腳本標記是自封閉的,則腳本標記尤其無效,所以有時需要防止自閉標記,即使沒有內部文本。 –

1

你有沒有嘗試過這樣的事情:

if (someString.Length > 0) 
{ 
    someXmlWriter.WriteElementString("my-tag", someString); 
} 
else 
{ 
    someXmlWriter.WriteStartElement("my-tag"); 
    someXmlWriter.WriteEndElement("my-tag"); 
} 

也許做一個實用工具類,作爲一個成員函數。

+0

我還沒有嘗試,但我懷疑它會工作。唉,我正在使用遺留代碼,並且我正在採取「最少更改」的方法...... – mjv

+0

實用工具類或派生一個XmlWriter類來完成上述工作。兩者都可能是大量的編輯,但也可能是「最少改變」的方法。 – DwB

+0

事實上,在上面引用的「重複」問題中也提出了這種解決方案,以及將其作爲擴展方法的想法。如果全部失敗,我可能會這樣做,或者重寫解析器,使其在_element_級別工作。無論如何,感謝我的測試 – mjv

17

這爲我工作:

writer.WriteStartElement("my-tag"); 
writer.WriteRaw(someString); 
writer.WriteFullEndElement(); 

對writeEndElement還是自我封閉的標籤

+1

,如果我做writer.WriteRaw(「」),然後writer.WriteEndElement(),我的標籤不是自我封閉。 VS 2010。 –

0

我只是碰到了這個確切同樣的問題,雖然這似乎是一種黑客攻擊,這確實工作,對我不得不合作的現有代碼非常沒有影響。

private static XElement MakeElementLongHand(this XElement rootElem) 
{ 
    rootElem.Value = " "; 
    rootElem.Value = string.Empty; 
    return rootElem; 
} 
3

如果你得到的消息Extension method can only be declared in non-generic, non-nested static class作爲字this可以突出,只需創建一個擴展類,如下圖所示:

public static class Extension 
{ 
    public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value) 
    { 
     writer.WriteStartElement(localName); 
     writer.WriteRaw(value); 
     writer.WriteFullEndElement(); 
    } 
} 

希望這證明是有用:-)

1

離開這個這裏如果有人需要它;因爲上面的答案都沒有解決它對我來說,或者似乎是矯枉過正。

FileStream fs = new FileStream("file.xml", FileMode.Create); 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 
    XmlWriter w = XmlWriter.Create(fs, settings); 
    w.WriteStartDocument(); 
    w.WriteStartElement("tag1"); 

     w.WriteStartElement("tag2"); 
     w.WriteAttributeString("attr1", "val1"); 
     w.WriteAttributeString("attr2", "val2"); 
     w.WriteFullEndElement(); 

    w.WriteEndElement(); 
    w.WriteEndDocument(); 
    w.Flush(); 
    fs.Close(); 

訣竅是設置XmlWriterSettings.Indent =真,並把它添加到的XmlWriter

編輯:

另外,您還可以使用

w.Formatting = Formatting.Indented; 

,而不是添加XmlWriterSettings。

2

試試這個:

x.WriteStartElement("my-tag"); 

//Value of your tag is null 

If (<"my-tag"> == "") 

{ 
    x.WriteWhitespace(""); 
}else 
    x.WriteString(my-tag); 

x.WriteEndElement(); 
0

我用下面的代碼:

if (string.IsNullOrEmpty(myStringValue)) 
{ 
    myWriter.WriteStartElement("mytag"); 
    myWriter.WriteFullEndElement(); 
} 
else 
{ 
    myWriter.WriteElementString("mytag", myStringValue); 
} 
相關問題