【问题标题】:Filtering out empty tags in XML with C#使用 C# 过滤掉 XML 中的空标签
【发布时间】:2011-06-06 19:38:35
【问题描述】:

所以我正在使用这段代码来解析一个巨大的(80,000 行)XML 文档。然而,当它交给我时,它由于父节点添加了不必要的行(由代码中的 if 语句修复),现在它在空节点上加倍。

每当我点击一个空节点时,它都会在它之前的节点上加倍...例如这里是 xml 的一部分:

<edit>
    <who>Jim Johnson(Jim.m.Johnson@google.com)</who>
    <when>2010-08-18T12:14:33.613Z</when>
    <description></description>
</edit>

我得到的数据馈送最终看起来像:

who                Jim Johnson
when               8/18/2010
description        8/18/2010

有人知道如何去掉那些空标签吗? 这是生成此表的代码片段。

using (XmlReader reader = XmlReader.Create(new StringReader(
{
    // Parse the file and display each of the nodes.
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
                elementName = reader.Name;
                switch (elementName)
                {
                    //display my title stuff
                }
                break;
            case XmlNodeType.Text:
                elementText = reader.Value;
                break;
            case XmlNodeType.XmlDeclaration:
            case XmlNodeType.ProcessingInstruction:
                break;
            case XmlNodeType.Comment:
                break;
            case XmlNodeType.EndElement:
                if (elementName == reader.Name)
                {
                    contractRowArray1[0] = elementName;
                    contractRowArray1[1] = elementText;
                    contractRow = contractTable.NewRow();
                    contractRow.ItemArray = contractRowArray1;
                    contractTable.Rows.Add(contractRow);
                }
                break;
        }
    }
}

【问题讨论】:

    标签: c# xml tags


    【解决方案1】:

    这行得通吗?

    case XmlNodeType.Element:
        elementName = reader.Name;
        elementText = null;                  // ADDED
        switch (elementName)
        {
            //display my title stuff
        }
        break;
    

    ...

    case XmlNodeType.EndElement:
        if (elementName == reader.Name && elementText != null)       // MODIFIED
        {
            contractRowArray1[0] = elementName;
            contractRowArray1[1] = elementText;
            contractRow = contractTable.NewRow();
            contractRow.ItemArray = contractRowArray1;
            contractTable.Rows.Add(contractRow);
        }
        break;
    

    【讨论】:

    • 我已经尝试过了,因为空白标签 elementText 等于前面的文本,所以它永远不会为空。通过程序 elementText 只提到了 3 次,2 次在我发布的代码段中,唯一的其他时间是初始化。实际上,当我进行空检查时,我没有顶部,让我看看添加它是否有效而不会删除所有信息。
    • 似乎奏效了,我仍然很困惑在将其设置为 null 并且不再更改值之后它并没有清除所有数据....但我想它可以工作!谢谢! :D
    • 当它启动一个新节点时,它需要清除之前的状态。在这种情况下,您需要在开始新元素时清除前一个元素的文本。
    • 经过一些研究,我现在意识到 reader 只读取一行的一部分,我假设每次运行 while(reader.read()) 读取一整行,例如 blah 但我现在意识到它读取 运行它,然后等等,然后 似乎很奇怪。无论如何,再次感谢!
    • 最后一个问题,如果你能回答这个问题,我的 XML 中有这样的数据对象: 这是什么类型的 XmlNodeType?它似乎作为一个元素运行,我无法弄清楚如何将这种类型的元素与 类型的元素区分开来。
    猜你喜欢
    • 2016-12-24
    • 2016-03-18
    • 1970-01-01
    • 2016-05-10
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多