gpt4 book ai didi

C# LINQ xml解析使用 "PreviousNode"

转载 作者:数据小太阳 更新时间:2023-10-29 02:34:05 24 4
gpt4 key购买 nike

在 SO 的一些帮助下,我设法组合了以下 LINQ 表达式。

var parentids = xliff.Descendants()
.Elements(xmlns + "trans-unit")
.Elements(xmlns + "seg-source")
.Elements(xmlns + "mrk")
.Where(e => e.Attribute("mtype").Value == "seg")
.Select(item => (XElement)item.Parent.Parent.PreviousNode)
.Where(item => item != null)
.Select(item => item.Elements(xmlns + "source")
.Where(itema => itema != null)
.Select(itemb => itemb.Elements(xmlns + "x")
.LastOrDefault()
.Attribute("id")
.Value.ToString())).ToArray();

它所做的是定位一个 mrk 标签(具有 @mtype="seg"),然后它上升到 trans-unit 祖先 (.parent.parent) 并检查前一个兄弟 trans-unit 是否有子 trans,如果没有,它从 source 返回 子元素最后一个x元素的@id,否则返回null(必须返回null,不能不返回match ).

我需要补充一点,虽然下面的示例只有一个没有 trans 元素的这样的前一个节点,但在现实生活中的 xml 中还有更多,所以我必须使用 PreviousNode.

这是它使用的 XML,并完美返回 "2":

<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns:sdl="http://sdl.com/FileTypes/SdlXliff/1.0" version="1.2" sdl:version="1.0" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="Pasadena_Internet_2016.xml" source-language="en-US" datatype="x-sdlfilterframework2" target-language="da-DK">
<body>
<trans-unit id="d679cb2d-ecba-47ba-acb7-1bb4a798c755" translate="no">
<source>
<x id="0" />
<x id="1" />
<x id="2" />
</source>
</trans-unit>
<trans-unit id="aed9fde2-fd1b-4eba-bfc9-06d325aa7047">
<source>
<x id="3" />Pasadena, California’s iconic Colorado Boulevard <x id="4" />has been the site of the world-famous Tournament of Roses Parade since it began in 1890.
</source>
<seg-source>
<mrk mtype="seg" mid="1">
<x id="3" />Pasadena, California’s iconic Colorado Boulevard <x id="4" />has been the site of the world-famous Tournament of Roses Parade since it began in 1890.
</mrk>
</seg-source>
<target>
<mrk mtype="seg" mid="1">
<x id="3" /><x id="4" />Pasadena, Californiens ikoniske Colorado Boulevard har været stedet for den verdensberømte Rose Bowl-parade siden den begyndte i 1890.
</mrk>
</target>
</trans-unit>
</body>
</file>
</xliff>

问题是我需要解决的最后一步是,还有另一种类型的 XML,其起始 trans-unit 封装在另一个 group 元素中不存在于其他 XML 中。所以这里还有一个父级向上跳并获得前一个 trans-unit 兄弟,就在 group 之前。

我正在尝试将它构建到相同的 LINQ 表达式中,以便它处理这两种情况。

事实上,如果我将第 6 行修改成这样,那么它就可以工作了:

.Select(item => (XElement)item.Parent.Parent.Parent.PreviousNode)
<!-- ^------ additional Parent -->

下面是另一个 XML,它现在使用上述代码抛出异常,但它应该返回 "0":

<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns:sdl="http://sdl.com/FileTypes/SdlXliff/1.0" xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2" sdl:version="1.0">
<file original="Internet_Anti-DrugIntro2015.xml_1457007.xlf" datatype="x-sdlfilterframework2" source-language="en-US" target-language="hu-HU">
<body>
<trans-unit translate="no" id="c3a13bfb-ed51-49cf-8278-e2c86c2114c0">
<source>
<x id="0"/>
</source>
</trans-unit>
<group>
<sdl:cxts>
<sdl:cxt id="1"/>
</sdl:cxts>
<trans-unit id="3b4520df-4483-4c9e-8a9b-ce2544269f3e">
<source>
<x id="1"/>
</source>
<seg-source>
<mrk mtype="seg" mid="2">
<x id="1"/>Drugs are robbing our children of their future.
</mrk>
<mrk mtype="seg" mid="3">
<x id="2"/>Every 17 seconds a teenager experiments with an illicit drug for the first time.
</mrk>
</seg-source>
<target>
<mrk mtype="seg" mid="2">
<x id="1"/>A drogok megfosztják gyermekeinket a jövőjüktől.
</mrk>
<mrk mtype="seg" mid="3">
<x id="2"/>17 másodpercenként egy újabb tizenéves próbálja ki először a kábítószereket.
</mrk>
</target>
</trans-unit>
</group>
<trans-unit translate="no" id="7890462c-edcb-4fe6-9192-033ba76d9942">
<source>
<x id="183"/>
</source>
</trans-unit>
</body>
</file>
</xliff>

我将不胜感激任何帮助。

最佳答案

您可以尝试使用 Ancestors().Last() 来查找最高级别,而不是根据 XML 结构多次使用 Parent 向上导航 XML 树祖先命名为 “trans-unit”“group”,然后导航到上一个节点。

尝试替换这部分:

.Select(item => (XElement) item.Parent.Parent.PreviousNode)

用这个:

.Select(item => (XElement)item.Ancestors()
.Last(o => new[]{"trans-unit","group"}.Contains(o.Name.LocalName))
.PreviousNode)

关于C# LINQ xml解析使用 "PreviousNode",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36927046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com