让NodeList.SelectSingleNode()正常工作时遇到问题。 我的XML看起来像这样:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<inm:Results xmlns:inm="http://www.namespace.com/1.0">
<inm:Recordset setCount="18254">
<inm:Record setEntry="0">
<!-- snip -->
<inm:Image>fileName.jpg</inm:Image>
</inm:Record>
</inm:Recordset>
</inm:Results>
数据是一系列<inm:Record>
个条目。
我打开文档并根据“inm:Record”创建一个NodeList对象。这很有效。
XmlDocument xdoc = new XmlDocument();
xdoc.Load(openFileDialog1.FileName);
XmlNodeList xRecord = xdoc.GetElementsByTagName("inm:Record");
我开始使用for循环遍历NodeList。在处理给定条目之前,我想检查并查看<inm:Image>
是否已设置。我认为这样做非常容易
string strImage = xRecord[i].SelectSingleNode("inm:Image").InnerText;
我的想法是,“对于我正在使用的XRecord,请找到<inm:Image>
值...但这不起作用,因为我得到异常,说我需要一个XmlNameSpaceManager。所以,我试图设置它,但永远不会正确的语法。
在这种情况下,有人可以告诉我如何使用正确的XmlNameSpaceManager语法。
我现在解决了这个问题,循环遍历给定xRecord的所有childNodes,并在循环到它后检查标记。我想首先检查该值,看看是否需要循环遍历<inm:Record>
条目。
答案 0 :(得分:2)
无需遍历所有Record元素,只需使用XPath指定所需的子集:
XmlDocument xdoc = new XmlDocument();
xdoc.Load(openFileDialog1.FileName);
XmlNamespaceManager manager = new XmlNamespaceManager(xdoc.NameTable);
manager.AddNamespace("inm", "http://www.inmagic.com/webpublisher/query");
XmlNodeList nodes = xdoc.SelectNodes("/inm:Results/inm:Recordset/inm:Record[inm:Image != '']", manager);
答案 1 :(得分:0)
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
string strImage = xRecord[i].SelectSingleNode("inm:Image",nsMgr).InnerText;
应该这样做。
答案 2 :(得分:0)
使用LINQ to XML库,这是检索所述节点值的示例:
XDocument doc = XDocument.Load(openFileDialog1.FileName);
List<XElement> docElements = doc.Elements().ToList();
XElement results = docElements.Elements().Where(
ele => ele.Name.LocalName == "Results").First();
XElement firstRecord = results.Elements().Where(
ele => ele.Name.LocalName == "Record").First();
XElement recordImage = firstRecord .Elements().Where(
ele => ele.Name.LocalName == "Image").First();
string imageName = recordImage.Value;
顺便说一下,使用Hungarian notation for a type-checked language is overkill。当字符串变量始终为str
时,您不需要使用string
前置字符串变量。
答案 3 :(得分:0)
使用此Xml library,您可以获得具有Image子元素的所有记录:
XElement root = XElement.Load(openFileDialog1.FileName);
XElement[] records = root.XPath("//Record[Image]").ToArray();
如果要确保Image子项包含值,可以表示如下:
XElement[] records = root.XPath("//Record[Image != '']").ToArray();