【问题标题】:How to handle XML with unclosed tags? [duplicate]如何处理带有未闭合标签的 XML? [复制]
【发布时间】:2014-08-15 16:52:57
【问题描述】:

我有以下 Xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" name="test" start="2014-04-04T15:54:09.728Z">
  <upload>
    <filename value="D:\ftp\test1.TXT" />
    <destination value="/in/test1.TXT" />
    <result success="true" />
  </upload>
  <touch>
    <filename value="/in/test1.TXT" />
    <modification value="2014-03-27T12:45:20.000Z" />
    <result success="true" />
  <upload>
    <filename value="D:\ftp\test2.TXT" />
    <destination value="/in/test2.TXT" />
    <result success="true" />
  </upload>
  <touch>
    <filename value="/in/test2.TXT" />
    <modification value="2014-03-27T12:45:20.000Z" />
    <result success="false" />
  </touch>
</session>

我想浏览所有文件名元素,其中 result success="true" 两个节点都触摸和上传。

我写了以下代码

 var upload = from el in root.Elements("upload") select el;
  var touch = from el in root.Elements("touch") select el;

  // use zip to join the two lists together based on ordering to a new object
  // this WON'T work if the lists are different lengths!
  var filename = upload.Zip(touch,(u,t) => new { upload = u, touch = t })
        .Where(item => item.upload.Descendants("result").First().Attribute("success").Value  == "true" 
                   &&  item.touch.Descendants("result").First().Attribute("success").Value  == "true")
        .Select(item => item.upload.Descendants("filename").First().Attribute("value").Value);

它工作正常,但我的问题是有时我用 uclosed 标签读取 xml: 例如

<?xml version="1.0" encoding="UTF-8"?>
    <session xmlns="http://winscp.net/schema/session/1.0" name="test" start="2014-04-04T15:54:09.728Z">
      <upload>
        <filename value="D:\ftp\test1.TXT" />
        <destination value="/in/test1.TXT" />
        <result success="true" />
      </upload>
      <touch>
        <filename value="/in/test1.TXT" />
        <modification value="2014-03-27T12:45:20.000Z" />
        <result success="true" />
      <upload>
        <filename value="D:\ftp\test2.TXT" />
        <destination value="/in/test2.TXT" />
        <result success="true" />

在这种情况下,上面的代码将不起作用,如何更改它以读取带有未闭合标签的 xml 文件?

提前非常感谢,任何帮助将不胜感激!

【问题讨论】:

  • 带有未闭合/缺失标签的 XML 是 not XML;它是一些恰好类似于 XML 的文本。最好的解决方案是获取 [有效的] XML。

标签: c# xml


【解决方案1】:

您不能,因为除非 xml 有效,否则该集合将无效。考虑在针对它运行此代码之前验证 xml。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多