我正在准备一个 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# 代码?
您在结构化文本标签中缺少结束正斜杠。我会使用 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");
}
}
}