拆分字符串,如果超过指定的长度

时间:2013-04-18 13:58:33

标签: c# asp.net xml linq

我正在使用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.但我需要确定它是否尝试从xml节点的中间分割,然后它应该找到正好在{ {1}}节点并从那里拆分。 我应该在代码中添加什么来实现这个目标?

2 个答案:

答案 0 :(得分:3)

如果lblproductid.Text包含&<>,那该怎么办?

因此我会使用真正的xml解析器而不是手工形成它。

var xElem = new XElement("Root",
                    new XElement("ProductDetails",
                        new XElement("PId", lblproductid.Text),
                        new XElement("PDesc",strtxtProductDesc)));

var xml = xElem.ToString();

输出将是:

<Root>
  <ProductDetails>
    <PId>aaa</PId>
    <PDesc>aaa</PDesc>
  </ProductDetails>
</Root>

PS:您可以循环ProductDetails并计算总长度。

答案 1 :(得分:2)

您绝对应该使用XDocument代替string来构建和查询XML数据。

您可以在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();