我在 Visual Studio 2017 中工作,该项目使用 c#。我正在尝试使用标准 System.Xml.Linq 库解析一个 XML 文件。这是文件的文本
<?xml version="1.0" encoding="utf-8"?>
<SCL version="2007" revision="A"
xmlns="http://www.iec.ch/61850/2003/SCL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.iec.ch/61850/2003/SCL
C:\Data\sdps\SCL3.0\SCL.xsd">
<!-- Содержимое элемента -->
</SCL>
这是代码:
static void Main(string[] args)
{
XDocument xdoc = XDocument.Load(args[0]);
XElement xe = xdoc.Element("SCL");
if (xe == null)
{
Exit("Отсутствует элемент \"SCL\"");
return;
}
//...
}
如果 xml 包含该行
xmlns="http://www.iec.ch/61850/2003/SCL"
然后
xe == null
如果删除此行,则“xe”将具有预期接收的内容。
为什么会发生这种情况,是否有可能在存在字符串“xmlns =“http://www.iec.ch/61850/2003/SCL””的情况下正常解析 xml?
标记的限定名称(Qualified Name,QName)由两部分组成——本地名称(“SCL”)和命名空间(
"http://www.iec.ch/61850/2003/SCL")。要按名称查找标签,您需要指定两个部分。您可以通过多种方式做到这一点,这里有一些:
另外,以防万一,我提醒您,
xmlnsXML 语言中的属性定义了一个所谓的默认命名空间,它会自动应用于所有子元素(但不会应用于属性!)正如@Pavel Mayorov 在下一个答案中正确写的那样,要选择一个元素,除了本地名称之外,您还必须指定命名空间,但如果您不想指定或不知道,可以使用 Linq 功能:
那些。遍历所有元素 (
.Elements()) 并从中选择本地名称具有值"SCL"(.SingleOrDefault(...))的元素