jjzjj

c# - XML 元素规范化

coder 2024-06-25 原文

我有一些 XML 表示例如 4 个集合(A、B、C、D)的成员之间的排列。假设 A={A1,A2}、B={B1}、C={C1,C2} 和 D={D1,D2,D3} 但当前 XML 不正常,因为这些成员以非常规方式组合在每个回答。 “set”属性显示集合的名称,“member”显示每个集合的每个成员。此 XML 如下所示:

<root>
    <phrase permutation=ABCD>
       <ans number=1>
           <word set=A member=A1/>
           <word set=A member=A2/>
           <word set=B member=B1/>
           <word set=C member=C1/>
           <word set=D member=D2/>
       </ans>
       <ans number=2>
           <word set=A member=A1/>
           <word set=B member=B1/>
           <word set=C member=C1/>
           <word set=C member=C2/>
           <word set=C member=C3/>
           <word set=D member=D1/>
           <word set=D member=D3/>
       </ans>
    </phrase>
</root>

我想将每个排列放在一个特定的答案中。每个答案应该只从 A 的一个成员开始,以 D 的一个成员结束,并且只使用它们之间的集合 B 和 C 的一个成员。 例如,答案 A1A2B1C1D2 应该与 A1B1C1D2、A2B1C1D2 分开,答案 A1B1C1C2C3D1D3 应该与 A1B1C1D1、A1B1C1D3、A1B1C2D1、A1B1C2D3、A1B1C3D1 和 A1B1C3D3 分开,最终 XML 如下所示:

<root>
    <phrase permutation=ABCD>
       <ans number=1>
           <word set=A member=A1/>
           <word set=B member=B1/>
           <word set=C member=C1/>
           <word set=D member=D2/>
       </ans>
       <ans number=2>
           <word set=A member=A2/>
           <word set=B member=B1/>
           <word set=C member=C1/>
           <word set=D member=D2/>
       </ans>
       <ans number=3>
           <word set=A member=A1/>
           <word set=B member=B1/>
           <word set=C member=C1/>
           <word set=D member=D1/>
           </ans>
       <ans number=4>
           <word set=A member=A1/>
           <word set=B member=B1/>
           <word set=C member=C1/>
           <word set=D member=D3/>
           </ans>
       <ans number=5>
           <word set=A member=A1/>
           <word set=B member=B1/>
           <word set=C member=C2/>
           <word set=D member=D1/>
       </ans>
       <ans number=6>
           <word set=A member=A1/>
           <word set=B member=B1/>
           <word set=C member=C2/>
           <word set=D member=D3/>
       </ans>
       <ans number=7>
           <word set=A member=A1/>
           <word set=B member=B1/>
           <word set=C member=C3/>
           <word set=D member=D1/>
      </ans>
      <ans number=8>
           <word set=A member=A1/>
           <word set=B member=B1/>
           <word set=C member=C3/>
           <word set=D member=D3/>
       </ans>
    </phrase>
</root>

我希望我的问题很清楚,你可以帮助我。 谢谢

最佳答案

好的,首先:请注意,在您的 XML 属性中未加引号,因此 .NET 的标准 XML 处理将无法立即读取这些属性 - 我只是更正了这些属性以在下面编写解决方案。

var original = XDocument.Parse(/* your XML as string */);

var normalized = new XDocument(original);

foreach (var phraseNode in normalized.Root.Elements("phrase"))
{
   phraseNode.Elements().Remove();
   int ansNo = 1;

   foreach(var answer in original.Root
                                 .Elements("phrase")
                                 .Single(p => p.Attribute("permutation").Value
                                            == phraseNode.Attribute("permutation").Value)
                                 .Elements("ans"))
   {
      var groupedWords = answer.Elements("word")
                               .GroupBy(w => w.Attribute("set").Value)
                               .ToArray();
      var newAnswers = groupedWords.Skip(1)
                                   .Aggregate(
                                     groupedWords[0].Select(w => Enumerable.Repeat(w, 1)),
                                     (combinations, newWords) =>
                                         combinations.Join(newWords,
                                                           c => 1,
                                                           w => 1,
                                                           (c, w) => c.Concat(new[] { w })));
      foreach (var newAnswer in newAnswers)
      {
         var ansNode = new XElement("ans", new XAttribute("number", ansNo++));
         ansNode.Add(newAnswer.Select(w => new XElement(w)).ToArray());
         phraseNode.Add(ansNode);
      }
   }
}

如果您不知道 LINQ to XML,一开始这可能有点吓人;希望通过一些简单的阅读或先验知识,唯一更复杂的(当然是相对而言!)位可能是生成排列的实际代码(初始化 newAnswers var 的部分) - 你可以采取这个按表面值(value)或尝试阅读更多有关 LINQ 联接如何工作的信息。

此外 - 请注意,编写本文时并未考虑任何繁重的优化;在 99,99% 的情况下,这应该不是问题。

关于c# - XML 元素规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20647214/

有关c# - XML 元素规范化的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  3. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  4. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  5. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  6. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  7. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

  8. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  9. ruby - gem 规范失败 - 2

    我正在为毕业设计开发GEM,TravisCI构建不断失败。这是我在Travis上的链接:https://travis-ci.org/ricardobond/perpetuus/builds/8709218构建错误是:$bundleexecrakerakeaborted!Don'tknowhowtobuildtask'default'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in`eval'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_

  10. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

随机推荐