我正在使用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}}节点并从那里拆分。 我应该在代码中添加什么来实现这个目标?
答案 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();