【问题标题】:Using LINQ to parse one XML file into multiple files based on child element value使用 LINQ 根据子元素值将一个 XML 文件解析为多个文件
【发布时间】:2017-04-05 22:35:23
【问题描述】:

我有一个 XML 文件,我想将其拆分为多个基于 VIEWNAME 的 XML 文件。

根据下面的示例,存在三个 VIEWNAME 值,并且对于每个值,还有 VIEWPANE 元素和 VIEWCOLUMN 元素。

使用 LINQ,到目前为止,我的代码可以保存仅包含 VIEWNAME 节点的文件:

static void VisualViews( XDocument xdoc)
{
  var baseFolder = Prep(FolderRDS, "VisualViews");

  var viewNames = xdoc.Element("VisualModelDS").Elements("viewname");

  foreach (var viewName in viewNames)
  {
    var name = viewName.Element("viewname").Value;
    viewName.Save(string.Format(@"{0}{1}.xml", baseFolder, name));
  }
}

我正在寻求帮助以包括具有相应 VIEWNAME 值的其他节点。我想我想要的是对具有相同子 VIEWNAME 元素的所有父/子元素进行分组,然后根据 VIEWNAME 元素值将每组元素保存到自己的 XML 文件中。

下面的 XML 将解析为 2 个文件,并且我嵌入了一个硬返回来区分哪些元素将进入哪个文件。

总而言之,每个父元素都有一个子 VIEWNAME 元素作为分组依据。

编辑 XML 以将空间嵌入到元素值中

<?xml version="1.0" standalone="yes"?>
<VisualModelDS>
  <viewname>
    <viewname>A B C</viewname>
  </viewname>
  <viewpane>
    <viewname>A B C</viewname>
    <viewpane>ALPHA</viewpane>
  </viewpane>
  <viewcolumn>
    <viewname>A B C</viewname>
    <viewpane>ALPHA</viewpane>
    <viewcolumn>Apples</viewcolumn>
  </viewcolumn>
  <viewcolumn>
    <viewname>A B C</viewname>
    <viewpane>ALPHA</viewpane>
    <viewcolumn>Oranges</viewcolumn>
  </viewcolumn>

  <viewname>
    <viewname>X Y Z</viewname>
  </viewname>
  <viewpane>
    <viewname>X Y Z</viewname>
    <viewpane>CAPPA</viewpane>
  </viewpane>
  <viewcolumn>
    <viewname>X Y Z</viewname>
    <viewpane>CAPPA</viewpane>
    <viewcolumn>Macadema</viewcolumn>
  </viewcolumn>
  <viewcolumn>
    <viewname>X Y Z</viewname>
    <viewpane>CAPPA</viewpane>
    <viewcolumn>Pecan</viewcolumn>
  </viewcolumn>
  <viewpane>
    <viewname>X Y Z</viewname>
    <viewpane>OMEGA</viewpane>
  </viewpane>
  <viewcolumn>
    <viewname>X Y Z</viewname>
    <viewpane>OMEGA</viewpane>
    <viewcolumn>Peanut</viewcolumn>
  </viewcolumn>
</VisualModelDS>

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:
    var viewNames = xdoc.Root.Elements("viewname").Elements("viewname");
    
    foreach (var viewName in viewNames)
    {
        var group = new XElement(viewName.Value.Replace(" ", ""),
            xdoc.Root.Elements().Where(elem => elem.Element("viewname").Value == viewName.Value));
    
        group.Save(viewName.Value + ".txt");
    }
    

    【讨论】:

    • 谢谢 - 我明天早上试试(我的)!
    • 很遗憾在 VAR GROUP 语句中遇到错误:The ' ' character, hexadecimal value 0x20, cannot be included in a name.
    • 为简洁起见,我简化了我的 XML 示例 - 我将对其进行一些扩展以提供更清晰的说明。
    • 好的,我想我明白发生了什么。您的解决方案将 VALUES 转换为 ELEMENTS 并且 ELEMENTS 名称不能嵌入空格...当然,空格在值中是可以的,但同样不能用于 ELEMENTS。
    • 进行更改后,这引发了 NULL EXCEPTION 错误:elem.Element("viewname").Value == viewName.Value - 我怀疑我需要应用 REPLACE 那里很好。当然,对于所有 REPLACE 方法调用,我感觉我的输出会受到影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多