我有4个类似的节点,有4个不同的值。例如,我有以下值。
<sample>
<a>123</a>
<a>45</a>
<a>67</a>
<a>890</a>
</sample>
我需要检查每个节点的长度,如果它小于3,那么前导零应该如下所示。
<sample>
<a>123</a>
<a>045</a>
<a>067</a>
<a>890</a>
</sample>
在追加前导零之后,我需要将所有值连接在一起并将其作为单个字符串传递。
<a>123045067890</a>
请提供最佳解决方案。
答案 0 :(得分:1)
这是使用XPath的一种方法:
string xml = @"
<sample>
<a>123</a>
<a>45</a>
<a>67</a>
<a>890</a>
</sample>
";
//load xml
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xml);
//get all <a> nodes and cast them to List<XmlNode>
var nodes = xdoc.SelectNodes("sample/a")
.Cast<XmlNode>().ToList();
//iterate through each node and append leading zeroes until length is 3 chars
nodes.ForEach(n => n.InnerText = n.InnerText.PadLeft(3, '0'));
//join all values and add tags to beginning and the end
string concatenatedValues = "<a>" + string.Join("", nodes.Select(x => x.InnerText).ToArray()) + "</a>";
答案 1 :(得分:1)
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="sample">
<a>
<xsl:for-each select="a">
<xsl:value-of select="format-number(., '000')" />
</xsl:for-each>
</a>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,返回:
<?xml version="1.0" encoding="UTF-8"?>
<a>123045067890</a>
答案 2 :(得分:0)
你可以试试这个:
string xml = @"<sample>
<a>123</a>
<a>45</a>
<a>67</a>
<a>890</a>
</sample>";
XDocument xmlDoc = XDocument.Parse(xml);
int value = 0;
StringBuilder errorsSb = new StringBuilder();
List<string> a_Nodes = new List<string>();
xmlDoc.Descendants("a").Select(x => x.Value).ToList().ForEach(x =>
{
if (int.TryParse(x, out value))
a_Nodes.Add(value.ToString("D3"));
else
errorsSb.AppendLine($"Value {value} is not a number");
});
string res = String.Join(string.Empty, a_Nodes);
if (!string.IsNullOrWhiteSpace(errorsSb.ToString()))
{
// handle errors
}
}