Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#LINQ xml解析使用;PreviousNode“;_C#_Xml_Linq_Xml Parsing - Fatal编程技术网

C#LINQ xml解析使用;PreviousNode“;

C#LINQ xml解析使用;PreviousNode“;,c#,xml,linq,xml-parsing,C#,Xml,Linq,Xml Parsing,在SO的帮助下,我成功地组合了以下LINQ表达式 var parentids = xliff.Descendants() .Elements(xmlns + "trans-unit") .Elements(xmlns + "seg-source") .Elements(xmlns + "mrk") .Where(e => e

在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,不能不返回匹配项)

我需要补充的是,虽然下面的示例只有一个这样的前一个节点,没有
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,它现在抛出上述代码的异常,但它应该返回
“0”


毒品正在夺走我们孩子的未来。
每17秒就有一名青少年第一次尝试非法药物。
一个drogok megfosztják gyermekeinket一个jövőjüktől。
17 másodpercenként egyújabb tizenéves próbálja ki először a kábítószeret。

我将非常感谢您的帮助。

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

尝试更换此部件:

.Select(item => (XElement) item.Parent.Parent.PreviousNode)
关于这一点:

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

试试这个:.Where(itema=>(itema!=null)和&(itemb.Elements(xmlns+“x”)!=null))@jdweng——我猜你的意思是
itema
not
itemb
范围中不存在这个。虽然这可以防止异常,但它不会像应该的那样返回“0”。好的,谢谢。我尝试了这个(包括
new[]{“trans-unit”,“group”}
new[]{“group”,“trans-unit”}
但是在下一行
。其中(item=>item!=null)
项的值是
,它低于
,因此似乎第一个
跨单元
被视为匹配项,然后它的
前一个节点
被匹配,而不是上到
,然后匹配
前一个节点
。@ib11我的错,我想它可能是
 同时存在的trans-unit
group
没有注意到
group
实际上是
trans-unit
的父级。在这种情况下,请尝试使用
Last()
而不是
First()
.Select(item => (XElement) item.Parent.Parent.PreviousNode)
.Select(item => (XElement)item.Ancestors()
                              .Last(o => new[]{"trans-unit","group"}.Contains(o.Name.LocalName))
                              .PreviousNode)