草庐IT

xml - 在 Swift 中对 XML 元素进行分组

coder 2023-09-10 原文

我有一组 CGPoints(当然还有它们的 x/y 坐标)。我正在尝试创建 xml 结构并将其导出到文件,但无法正确排列元素。我需要将 cgpoints 按四个分组,然后在每个组的末尾添加源元素(带有关闭 map 标记)。像这样:

<map>
   <point id="1" top="0" left="0"/>
   <point id="2" top="0" left="532"/>
   <point id="3" top="211" left="532"/>
   <point id="4" top="211" left="0"/>
   <source image="mix" top="0" left="0" width="532" height="211"/>
</map>
<map>
   <point id="5" top="0" left="532"/>
   <point id="6" top="0" left="686"/>
   <point id="7" top="211" left="686"/>
   <point id="8" top="211" left="532"/>
   <source image="mix" top="0" left="532" width="154" height="211"/>
</map>

但是我得到的结果是这样的:

<map>
   <point id="1" top="0" left="0"/>
   <point id="2" top="0" left="532"/>
   <point id="3" top="211" left="532"/>
   <point id="4" top="211" left="0"/>
   <point id="5" top="0" left="532"/>
   <point id="6" top="0" left="686"/>
   <point id="7" top="211" left="686"/>
   <point id="8" top="211" left="532"/>
   <source image="mix" top="0" left="532" width="154" height="211"/>
</map>

我做错了什么?这是一个代码:

   let map = NSXMLElement(name: "map")

   let array = myArray.flatMap { return $0.myCoord() }  
      for (ind, dot) in array.enumerate() {  
         let x1 = dot.x
         let y1 = dot.y

   let point = NSXMLElement(name: "point")
        point.attributes = [
            xmlAttributeWithName("id", value: "\(ind+1)"),
            xmlAttributeWithName("top", value: "\(Int(x1))"),
            xmlAttributeWithName("left", value: "\(Int(y1))")
        ]
        map.addChild(point)
    }

    let source = NSXMLElement(name: "source")
        source.attributes = [
            xmlAttributeWithName("image", value: "mix"),
            xmlAttributeWithName("top", value: "\(Int(x1))"),
            xmlAttributeWithName("left", value: "\(Int(y1))"),
            xmlAttributeWithName("width", value: "\(Int(x3))"),
            xmlAttributeWithName("height", value: "\(Int(y3))")
        ]
        map.addChild(source)

最佳答案

将 2 个循环嵌套在一起。外循环应该步进 4,内循环步进 1 并对应于每个 map 元素:

let root = NSXMLElement(name: "root")

for i in 0.stride(to: array.count, by: 4) {
    let map = NSXMLElement(name: "map")

    for j in i..<(i + 4) {
        let point = NSXMLElement(name: "point")

        point.attributes = [
            xmlAttributeWithName("id", value: "\(j)"),
            xmlAttributeWithName("top", value: "\(Int(array[j].y))"),
            xmlAttributeWithName("left", value: "\(Int(array[j].x))")
        ]
        map.addChild(point)
    }

    let source = NSXMLElement(name: "source")
    source.attributes = [
        xmlAttributeWithName("image", value: "mix"),
        xmlAttributeWithName("top", value: "\(Int(array[i+2].y))"),
        xmlAttributeWithName("left", value: "\(Int(array[i].x))"),
        xmlAttributeWithName("width", value: "\(Int(array[i+3].x))"),
        xmlAttributeWithName("height", value: "\(Int(array[i+1].y))")
    ]
    map.addChild(source)
    root.addChild(map)
}

print(root)

(假设 array 的长度可以被 4 整除)

关于xml - 在 Swift 中对 XML 元素进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39216422/

有关xml - 在 Swift 中对 XML 元素进行分组的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. 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代码修改为

  4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  5. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  6. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  7. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  8. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  9. 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([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

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

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

随机推荐