使用LINQ to XML查询元素时出错

麦克风

这是我拥有的XML文件的一小部分。

我可以读取所需的内容,例如可以获取类型消息等。但是,在PreflightResultEntry部分之一中,有一组名为Var的元素,我需要使用“ <Var name="NumPages">8</Var>

 --     
 <PreflightResultEntry type="GeneralDocInfo">
    <PreflightResultEntryMessage xml:lang="en-US">
        <Message>457834a.pdf </Message>
        <StringContext>
            <BaseString>%FileInfo%</BaseString>
            <Const name="Category">GeneralDocInfo</Const>
            <Const name="ActionID">-1</Const>
            <Instance>
                <Var name="FileInfo">
                    <Var name="DIPath">/V/PitStop/Testing/Mike/Processed Docs on Success/457834a.pdf</Var>
                    <Var name="CreationDate">D:20120724153648-05'00'</Var>
                    <Var name="ModDate">D:20120725134534-04'00'</Var>
                    <Var name="Producer">Adobe PDF Library 10.0</Var>
                    <Var name="Creator">Acrobat PDFMaker 10.1 for Word</Var>
                    <Var name="Author">DOL Comments</Var>
                    <Var name="Title"/>
                    <Var name="Subject"/>
                    <Var name="Keywords"/>
                    <Var name="Trapped">1</Var>
                    <Var name="NumPages">8</Var>
                    <Var name="Major">1</Var>
                    <Var name="Minor">5</Var>
                    <Var name="WasRepairedOnOpen">0</Var>
                    <Var name="IsLinearized">0</Var>
                    <Var name="ContainsThumbnails">0</Var>
                    <Var name="LeftToRightReading">1</Var>
                    <Var name="ContainsJobTicket">0</Var>
                    <Var name="EncryptionType">1</Var>
                    <Var name="Permissions">-1</Var>
                    <Var name="PrinergyTraps">3</Var>
                </Var>
                <Location page="-1"/>
            </Instance>
        </StringContext>
    </PreflightResultEntryMessage>
</PreflightResultEntry>
      ---

在这里,我得到的适用于消息和类型的内容

  List<PitStopMessage> messages = XDocument.Load(file)
      .Descendants("PreflightResultEntryMessage")
      .Where(x => x.Parent != null )
      .Select(x => new PitStopMessage()
      {
          message = x.Element("Message").Value,
          type = x.Parent.Attribute("type").Value,
          xmllevel = x.Parent.Attribute("level") != null ? x.Parent.Attribute("level").Value : String.Empty,
          link = 0
      }).ToList();

只有在父元素PreflightResultEntry中退出时,我才需要对元素var进行新查询

这是我到目前为止所拥有的,但是给了我一个错误“对象引用未设置为对象的实例”。这表明我在寻找什么(元素)不存在。

 List<PitStopPages> messages = XDocument.Load(file)
     .Descendants("PreflightResultEntryMessage")
     .Where(x => x.Parent != null && x.Parent.Attribute("type").Value == "GeneralDocInfo" && x.Parent.Element("Var").Value == "NumPages")
     .Select(x => new PitStopPages()
     {
         Pages = x.Parent.Attribute("name").Value
     }).ToList();
查尔斯·玛格(Charles Mager)

如果您从逻辑上通读您的查询,则可能会发现错误。

您的查询正在尝试查找:

  • 元素称为 PreflightResultEntryMessage
  • 如果其父项的type属性为GeneralDocInfo
  • 其父元素的第一个子节点Var具有的值NumPages
  • 获取父元素的name属性值

问题是最后两个部分。Parent在您所有情况下都是PreflightResultEntry要素。PreflightResultEntry没有任何子Var元素,没有Var元素具有value NumPages,并且PreflightResultEntry没有name属性。这些中的任何一个都将导致空引用异常(您所看到的异常)。

最好是从上至下进行处理,而不是先查找一个元素然后再查找其父元素。所以:

  • 查找称为元素PreflightResultEntry具有type的属性GeneralDocInfo
  • 获取后代Var元素的name属性为NumPages

所以:

var numPages = (int)XDocument.Load(file)
        .Descendants("PreflightResultEntry")
        .Where(x => (string) x.Attribute("type") == "GeneralDocInfo")
        .Descendants("Var")
        .Single(x => (string) x.Attribute("name") == "NumPages");

请参阅此小提琴以获得有效的演示。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试使用 Linq 查询时出现问题。找不到 xml 元素

来自分类Dev

在迭代XML LINQ查询时访问嵌套元素?

来自分类Dev

使用TimeSpan转换LINQ查询时出错?到列表<>?

来自分类Dev

使用动态Linq查询子字符串时出错

来自分类Dev

使用TimeSpan转换LINQ查询时出错?到列表<>?

来自分类Dev

使用LINQ查询XML以返回不同的子元素

来自分类Dev

LINQ to XML嵌套元素查询

来自分类Dev

Linq to XML查询嵌套元素

来自分类Dev

使用LINQ从XML元素获取属性时遇到麻烦

来自分类Dev

尝试在Linq中使用包含时出错

来自分类Dev

使用LINQ To XML定制XML元素

来自分类Dev

在Tasks中使用LINQ查询min元素

来自分类Dev

使用Linq内联定义查询参数类型List <int>时出错

来自分类Dev

LINQ to XML查询。获取元素属性

来自分类Dev

基于2个元素的XML linq查询

来自分类Dev

使用LINQ查询列表

来自分类Dev

使用||的Linq搜索查询

来自分类Dev

使用GroupBy的Linq查询

来自分类Dev

使用Foreach的Linq查询

来自分类Dev

使用maven-replacer-plugin替换XML元素内容时出错

来自分类Dev

使用LINQ to XML查询站点地图

来自分类Dev

如何使用LINQ查询复杂的XML文档?

来自分类Dev

使用LINQ解析XML以获取子元素

来自分类Dev

使用LINQ获取XML的主要元素属性

来自分类Dev

使用LINQ选择是否存在XML元素

来自分类Dev

使用LINQ检查XML元素是否存在

来自分类Dev

使用linq访问xml中的特殊元素

来自分类Dev

使用linq从xml读取特定元素

来自分类Dev

如何使用 LINQ 获取 XML 元素