【问题标题】:Formatting an elements text using descendants of XElement使用 XElement 的后代格式化元素文本
【发布时间】:2015-01-13 14:38:47
【问题描述】:

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

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

我的例子

<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

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

【问题讨论】:

    标签: c# xelement


    【解决方案1】:

    您可以使用Parent 属性获取文本节点的父节点并检查其名称:

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

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

    【讨论】:

    • 这是一个很好的答案,是否可以在示例中显示的价格文本之前添加一个 £ 符号?例如5.00 英镑
    • 当然,只需使用字符串连接或formatting
    • 感谢您的链接,让自己熟悉一些东西。在这种情况下,linq 查询不是必需的,但我确定将来会派上用场。
    • 最后一个问题,虽然您在上面提到了节点类型,但节点类型可以是文本以外的任何内容吗?例如,如果日期设置为日期时间对象?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多