使用 XElement 的后代设置元素文本的格式

本文关键字:文本 格式 元素 后代 XElement 使用 设置 | 更新日期: 2023-09-27 18:37:18

我想知道如何从层次结构中选择一个特定的元素,以便我可以格式化其文本。

在下面的示例中,我想格式化特定元素以删除日期的时间部分,但我也在寻找一种格式化任何元素的方法,例如在每个价格标签之间的文本中添加货币符号。

我的例子

<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 节点的格式

字符串。在 XElement 中格式化而不是格式化

对此的任何帮助都会很棒,因为我以前从未尝试过。谢谢。

使用 XElement 的后代设置元素文本的格式

您可以使用

Parent属性获取文本节点的父节点并检查其名称:

foreach (XText node in doc.DescendantNodes()
                          .Where(x => NodeType == XmlNodeType.Text))
{
       if(node.Parent.Name == "date") { ... }
       if(node.Parent.Name == "price") { ... }
}

顺便说一句,不要忘记在进行更改后使用XDocument.Save方法保存文档。

我通常创建一个类来表示xml,并发送具有正确类型的对象的实例。 例如转换。ToDecimal(node.innerText)