0

String Builder を使用して XML 形式のファイルを生成しています。ファイルは次のようになります:-

  StringBuilder strBldr = new StringBuilder();
  strBldr.AppendLine("<Root>");
  strBldr.AppendLine("<ProductDetails>");
  strBldr.AppendLine("<PId>" + lblproductid.Text + "</PId>");
  strBldr.AppendLine("<PDesc>" + strtxtProductDesc + "</PDesc>");
  strBldr.AppendLine("</ProductDetails>");
  strBldr.AppendLine("</Root>");

これは for ループ内にあるため、多くの製品の詳細が含まれる場合があります。この文字列が制限された長さ (100 と仮定) を超える場合は、この文字列を分割する必要があります。これまでは簡単でした。次の方法を使用してこれを分割できます:-

 public static IEnumerable<string> SplitByLength(this string str, int maxLength)
 {
        for (int index = 0; index < str.Length; index += maxLength)
        {
            yield return str.Substring(index, Math.Min(maxLength, str.Length - index));
        }
  }

しかし、問題は、このメソッドは、長さが 100 を超えていることがわかった場合、単に文字列を分割するだけです<ProductDetails>。そこの。これを実現するには、コードに何を追加すればよいですか?

4

2 に答える 2

2

XML データの構築とクエリには、XDocument代わりに必ず使用する必要があります。string

XDocument長さで分割されるクラスに拡張メソッドを作成できます。

public static class XDocumentExtensions
{
    public static IEnumerable<string> SplitByLength(this XDocument source, string elementName, int maxLength)
    {
        if (source == null)
            throw new ArgumentNullException("source");
        if (string.IsNullOrEmpty(elementName))
            throw new ArgumentException("elementName cannot be null or empty.", "elementName");
        if (maxLength <= 0)
            throw new ArgumentException("maxLength has to be greater than 0.", "maxLength");

        return SplitByLengthImpl(source, elementName, maxLength);
    }

    private static IEnumerable<string> SplitByLengthImpl(XDocument source, string elementName, int maxLength)
    {
        var builder = new StringBuilder();

        foreach (var element in source.Root.Elements(elementName))
        {
            var currentElementString = element.ToString();
            if (builder.Length + currentElementString.Length > maxLength)
            {
                if (builder.Length > 0)
                {
                    yield return builder.ToString();
                    builder.Clear();
                }
                else
                {
                    throw new ArgumentException(
                        "source document contains element with length greater than maxLength", "source");
                }
            }

            builder.AppendLine(currentElementString);
        }
        if (builder.Length > 0)
            yield return builder.ToString();
    }
}

そして、そのように使用します:

var parts = doc.SplitByLength("ProductDetails", 200).ToList();
于 2013-04-18T14:26:08.060 に答える