【问题标题】:how to read from the xml node using c# as per my requirement如何根据我的要求使用 c# 从 xml 节点读取
【发布时间】:2016-01-12 23:03:57
【问题描述】:

这是我的 xml 代码:

  <?xml version="1.0" encoding="utf-8"?>
<xd:xmldiff version="1.0" srcDocHash="11928043053884448382" options="IgnoreChildOrder IgnoreNamespaces IgnoreWhitespace IgnoreXmlDecl " fragments="no" xmlns:xd="http://schemas.microsoft.com/xmltools/2002/xmldiff">
    <xd:node match="2">
        <xd:node match="2">
            <xd:node match="19">
                <xd:node match="2">
                    <xd:add>Y</xd:add>
                </xd:node>
            </xd:node>
            <xd:add match="/2/2/11" opid="2" />
            <xd:change match="18" name="OWNINGSITE">
                <xd:node match="2">
                    <xd:remove match="1" />
                </xd:node>
            </xd:change>
            <xd:add match="/2/2/2-9" opid="1" />
            <xd:change match="17" name="STATUS">
                <xd:node match="2">
                    <xd:remove match="1" />
                </xd:node>
            </xd:change>
            <xd:remove match="14-16" />
            <xd:remove match="13" subtree="no">
                <xd:remove match="1-2" />
            </xd:remove>
            <xd:remove match="11" opid="2" />
            <xd:remove match="10" />
            <xd:remove match="2-9" opid="1" />
            <xd:remove match="1" />
        </xd:node>
        <xd:node match="5">
            <xd:node match="3">
                <xd:node match="11">
                    <xd:change match="1">0,1,0,1,0,0,0,0,1</xd:change>
                </xd:node>
            </xd:node>
        </xd:node>
    </xd:node>
    <xd:descriptor opid="1" type="move" />
    <xd:descriptor opid="2" type="move" />
</xd:xmldiff>

我已经编写了一个 c# 代码来解析每个节点并获取匹配的值。我无法弄清楚如何解析节点以获取所有匹配项的值。在调试代码时,我发现 nodelist 没有通过 "xmlDoc.DocumentElement.SelectNodes("/node");" 接收到适当的值由于哪个 foreach 根本没有被执行。我对“/node”的使用是否有权获取其属性“match”的值?

namespace demo
{
    class Program
    {
        static void Main()
        {

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("C:\\shreyas\\NX_Temp\\NX_Temp\\000048_A\\CompareReport3D.xml");
            XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("/node");
            string[] arr1 = new string[10];
            int i = 0;

            foreach (XmlNode node in nodeList)
            {
                 arr1[i] = node.Attributes["match"].Value;
                 i++;
            }

            i = 0;
            while (arr1[i] != null)
            {
                Console.WriteLine("the String=" + arr1[i]+ ":" + arr1[i++]+ ":" + arr1[i++]+":" + arr1[i++]);
            }

        }
    }
}

我需要以字符串的形式查找“匹配”的值

输出应该是: the String = 2:2:19:2

【问题讨论】:

  • 请为您的示例提供更详细的示例输出。我无法理解您的程序的确切结果应该是什么。
  • 您好,我对代码做了一些更改并添加了示例输出
  • 那么,它是否应该为每个没有子节点的节点输出由“匹配”值组成的路径?
  • 是的,它应该得到匹配值
  • 在调试代码时,我发现 nodelist 没有通过 "xmlDoc.DocumentElement.SelectNodes("/node");" 接收到适当的值由于哪个 foreach 根本没有被执行。

标签: c# .net xml


【解决方案1】:

最简单的方法是使用递归。

编写一个接受XmlNode nodestring currentPathList&lt;string&gt; paths 的函数。它应该:

  1. nodematch 属性附加到currentPath 并检查node 是否具有nodes 的子级。
  2. 如果没有孩子,它会将currentPath 添加到paths 并返回。
  3. 如果有孩子,它通过传递孩子currentPath(已修改)和paths为每个孩子调用自己。

首先,您将使用根节点、空字符串和空列表调用此函数。当函数完成时,以前的空列表将包含您的路径,例如您的示例有两条路径:

  • “2:2:19:2”
  • “2:5:3:11”

【讨论】:

  • 谢谢 Alexey :) 但我无法理解您的回答
【解决方案2】:

您可以使用正则表达式来匹配您要查找的所有属性:

// Find all attributes that match the pattern match="x" - where x can be any value.
foreach (var match in Regex.Matches(str, "match=\"([^\"]+)\""))
{
    // For each match, match only the "x" part of the result and remove the containing ".
    Console.WriteLine(Regex.Match(match.ToString(), "\"([^\"]+)\"").ToString()
        .Replace("\"", string.Empty));
}

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多