ToString()関数でxmlエンコーディングを取得する方法はありますか?
例:
xml.Save("myfile.xml");
につながる
<?xml version="1.0" encoding="utf-8"?>
<Cooperations>
<Cooperation>
<CooperationId>xxx</CooperationId>
<CooperationName>Allianz Konzern</CooperationName>
<LogicalCustomers>
しかし
tb_output.Text = xml.toString();
このような出力につながります
<Cooperations>
<Cooperation>
<CooperationId>xxx</CooperationId>
<CooperationName>Allianz Konzern</CooperationName>
<LogicalCustomers>
...
宣言を明示的に書き出すか、StringWriter
を使用してSave()
を呼び出します。
using System;
using System.IO;
using System.Text;
using System.Xml.Linq;
class Test
{
static void Main()
{
string xml = @"<?xml version='1.0' encoding='utf-8'?>
<Cooperations>
<Cooperation />
</Cooperations>";
XDocument doc = XDocument.Parse(xml);
StringBuilder builder = new StringBuilder();
using (TextWriter writer = new StringWriter(builder))
{
doc.Save(writer);
}
Console.WriteLine(builder);
}
}
これを拡張メソッドとして簡単に追加できます。
public static string ToStringWithDeclaration(this XDocument doc)
{
if (doc == null)
{
throw new ArgumentNullException("doc");
}
StringBuilder builder = new StringBuilder();
using (TextWriter writer = new StringWriter(builder))
{
doc.Save(writer);
}
return builder.ToString();
}
これには、が宣言ではない場合が強打されないという利点があります:)
次に使用できます:
string x = doc.ToStringWithDeclaration();
これはStringWriter
の暗黙のエンコーディングであるため、エンコーディングとしてutf-16を使用することに注意してください。ただし、StringWriter
のサブクラスを作成することで、自分自身に影響を与えることができます。 常にUTF-8を使用するため 。
DeclarationプロパティにはXML宣言が含まれます。内容と宣言を取得するには、次を実行できます。
tb_output.Text = xml.Declaration.ToString() + xml.ToString()
これを使って:
output.Text = String.Concat(xml.Declaration.ToString() , xml.ToString())
私はこれが好きでした
string distributorInfo = string.Empty;
XDocument distributors = new XDocument();
//below is important else distributors.Declaration.ToString() throws null exception
distributors.Declaration = new XDeclaration("1.0", "utf-8", "yes");
XElement rootElement = new XElement("Distributors");
XElement distributor = null;
XAttribute id = null;
distributor = new XElement("Distributor");
id = new XAttribute("Id", "12345678");
distributor.Add(id);
rootElement.Add(distributor);
distributor = new XElement("Distributor");
id = new XAttribute("Id", "22222222");
distributor.Add(id);
rootElement.Add(distributor);
distributors.Add(rootElement);
distributorInfo = String.Concat(distributors.Declaration.ToString(), distributors.ToString());
私がdistributorInfoで得るものについては以下をご覧ください
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Distributors>
<Distributor Id="12345678" />
<Distributor Id="22222222" />
<Distributor Id="11111111" />
</Distributors>
他の+1回答と同様ですが、宣言についてもう少し詳しく説明し、わずかに正確な連結を行います。
<xml />
宣言は、フォーマットされたXMLの独自の行にある必要があるため、改行が追加されていることを確認しています。注:Environment.Newline
を使用すると、プラットフォーム固有の改行が生成されます
// Parse xml declaration menthod
XDocument document1 =
XDocument.Parse(@"<?xml version=""1.0"" encoding=""iso-8859-1""?><rss version=""2.0""></rss>");
string result1 =
document1.Declaration.ToString() +
Environment.NewLine +
document1.ToString() ;
// Declare xml declaration method
XDocument document2 =
XDocument.Parse(@"<rss version=""2.0""></rss>");
document2.Declaration =
new XDeclaration("1.0", "iso-8859-1", null);
string result2 =
document2.Declaration.ToString() +
Environment.NewLine +
document2.ToString() ;
両方の結果が生成されます:
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0"></rss>
string uploadCode = "UploadCode";
string LabName = "LabName";
XElement root = new XElement("TestLabs");
foreach (var item in returnList)
{
root.Add(new XElement("TestLab",
new XElement(uploadCode, item.UploadCode),
new XElement(LabName, item.LabName)
)
);
}
XDocument returnXML = new XDocument(new XDeclaration("1.0", "UTF-8","yes"),
root);
string returnVal;
using (var sw = new MemoryStream())
{
using (var strw = new StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
{
returnXML.Save(strw);
returnVal = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
}
}
// ReturnVal has the string with XML data with XML declaration tag
これらの回答のいくつかは、ポスターの要求を解決しますが、過度に複雑に見えます。これは、別個のライターの必要性を回避し、欠落している宣言を処理し、標準のToString SaveOptionsパラメーターをサポートする単純な拡張メソッドです。
_public static string ToXmlString(this XDocument xdoc, SaveOptions options = SaveOptions.None)
{
var newLine = (options & SaveOptions.DisableFormatting) == SaveOptions.DisableFormatting ? "" : Environment.NewLine;
return xdoc.Declaration == null ? xdoc.ToString(options) : xdoc.Declaration + newLine + xdoc.ToString(options);
}
_
拡張機能を使用するには、xml.ToString()
をxml.ToXmlString()
に置き換えるだけです
XmlWriterを使用して、
Writer.WriteDocType()
方法。