从下一个父节点查找特定节点

问题描述 投票:0回答:1

我正在准备一个 C# 应用程序,其中我必须处理 xml 内容。

<Document>
    <SW.Blocks.FC ID="0">
        <ObjectList>
            <SW.Blocks.CompileUnit ID="4" CompositionName="CompileUnits">
                <AttributeList>
                    <NetworkSource>
                        <StructuredText xmlns="http://www.siemens.com/automation/Openness/SW/NetworkSource/StructuredText/v3">
                        <NewLine Num="2" UId="116" />
                        <Access Scope="GlobalVariable" UId="117">
                            <Symbol UId="118">
                              <Component Name="TP40" UId="119" />
                              <Token Text="." UId="120" />
                              <Component Name="IN" UId="121" />
                              <Token Text="." UId="122" />
                              <Component Name="StopSeg" UId="123" />
                              <Address Area="None" Type="Bool" BlockNumber="3" BitOffset="3024" Informative="true" />
                            </Symbol>
                        </Access>
                        <Blank Num="29" UId="124" />
                        <Token Text=":=" UId="125" />
                        <Blank Num="1" UId="126" />
                        <Access Scope="GlobalVariable" UId="127">
                        <Symbol UId="128">
                          <Component Name="I_TP40B1" UId="129" />
                          <Address Area="Input" Type="Bool" BitOffset="1026" Informative="true" />
                        </Symbol>
                        </Access>
                        <Token Text=";" UId="130" />
                        <NewLine Num="1" UId="131" />
                    </NetworkSource>
                </AttributeList>
            </SW.Blocks.CompileUnit>
        </ObjectList>
    </SW.Blocks.FC>
</Document>

根据给定的用户输入“StopSeg”,我需要获取名称为“I_TP40B1”的组件节点。有人可以帮我为此编写 XPath 吗?或任何 C# 代码?

c# xml xpath
1个回答
0
投票

您在结构化文本标签中缺少结束正斜杠。我会使用 Xml Linq 库而不是 XPath。请参阅下面的代码以获取示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApp10
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement symbol = doc.Descendants().Where(x => x.Name.LocalName == "Symbol").FirstOrDefault();
            XNamespace ns = symbol.GetDefaultNamespace();
            XElement component = symbol.Element(ns + "Component");
            string name = (string)component.Attribute("Name");

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.