使用 XElement 的后代格式化元素文本
Formatting an elements text using descendants of XElement
我想知道如何 select 层次结构中的特定元素,以便我可以格式化其文本。
在下面的示例中,我想格式化特定元素以删除日期的时间部分,但我也在寻找一种格式化任何元素的方法,例如向文本添加货币符号在每个价格标签之间。
我的例子
<orders>
<order>
<type> tools </type> //I would like the ability to select this element
<text> screwdriver </text>
<id> 100981 </id>
<price> 5.00 </price>
<date> 01/01/15 12:51:36 </date>
</order>
<order>
<type> uniform </type>
<text> boots </text>
<id> 100546 </id>
<price> 25.00 </price>
<date> 12/01/15 15:30:41 </date>
</order>
</orders>
我目前有什么
foreach (XElement element in doc.Descendants())
{
var nodes = element.Nodes().Where(p => p.NodeType == XmlNodeType.Text);
foreach (XText node in nodes)
{
node.Value = FirstLetterToUpper( node.Value );// set the first letter of each output to be uppercase
}
}
我试过的
foreach (XElement element in doc.Descendants())
{
var nodes = element.Nodes().Where(p => p.NodeType == XmlNodeType.Text);
if( element.Descendants() == element.Element("date"))
{
element.Value = Convert.ToDateTime(element.Value).ToShortDateString();
}
foreach (XText node in nodes)
{
node.Value = FirstLetterToUpper( node.Value );
}
}
我有一些 XML 经验,但以前从未使用过 XElement。
我已经搜索了一段时间了,但找不到我要找的东西。下面的答案是输入此问题的一些建议答案,但它们不提供解决方案,因为 XML 元素是在循环中动态生成的。
XElement node with text node has its formatting ignored
string.Format in XElement not formatting
任何帮助都将非常有用,因为我以前没有尝试过。谢谢。
您可以使用 Parent
属性 获取文本节点的父级并检查其名称:
foreach (XText node in doc.DescendantNodes()
.Where(x => NodeType == XmlNodeType.Text))
{
if(node.Parent.Name == "date") { ... }
if(node.Parent.Name == "price") { ... }
}
顺便说一句,不要忘记在进行更改后使用 XDocument.Save
方法保存文档。
我通常创建一个 class 来表示 xml 并发送到具有正确类型的对象实例。例如 convert.ToDecimal(node.innerText)
我想知道如何 select 层次结构中的特定元素,以便我可以格式化其文本。
在下面的示例中,我想格式化特定元素以删除日期的时间部分,但我也在寻找一种格式化任何元素的方法,例如向文本添加货币符号在每个价格标签之间。
我的例子
<orders>
<order>
<type> tools </type> //I would like the ability to select this element
<text> screwdriver </text>
<id> 100981 </id>
<price> 5.00 </price>
<date> 01/01/15 12:51:36 </date>
</order>
<order>
<type> uniform </type>
<text> boots </text>
<id> 100546 </id>
<price> 25.00 </price>
<date> 12/01/15 15:30:41 </date>
</order>
</orders>
我目前有什么
foreach (XElement element in doc.Descendants())
{
var nodes = element.Nodes().Where(p => p.NodeType == XmlNodeType.Text);
foreach (XText node in nodes)
{
node.Value = FirstLetterToUpper( node.Value );// set the first letter of each output to be uppercase
}
}
我试过的
foreach (XElement element in doc.Descendants())
{
var nodes = element.Nodes().Where(p => p.NodeType == XmlNodeType.Text);
if( element.Descendants() == element.Element("date"))
{
element.Value = Convert.ToDateTime(element.Value).ToShortDateString();
}
foreach (XText node in nodes)
{
node.Value = FirstLetterToUpper( node.Value );
}
}
我有一些 XML 经验,但以前从未使用过 XElement。
我已经搜索了一段时间了,但找不到我要找的东西。下面的答案是输入此问题的一些建议答案,但它们不提供解决方案,因为 XML 元素是在循环中动态生成的。
XElement node with text node has its formatting ignored
string.Format in XElement not formatting
任何帮助都将非常有用,因为我以前没有尝试过。谢谢。
您可以使用 Parent
属性 获取文本节点的父级并检查其名称:
foreach (XText node in doc.DescendantNodes()
.Where(x => NodeType == XmlNodeType.Text))
{
if(node.Parent.Name == "date") { ... }
if(node.Parent.Name == "price") { ... }
}
顺便说一句,不要忘记在进行更改后使用 XDocument.Save
方法保存文档。
我通常创建一个 class 来表示 xml 并发送到具有正确类型的对象实例。例如 convert.ToDecimal(node.innerText)