代码之家  ›  专栏  ›  技术社区  ›  Ryan Berger

如何正确解析具有任意名称空间的XML文档

  •  7
  • Ryan Berger  · 技术社区  · 14 年前

    我试图解析一些标准的XML文档,这些文档使用一个名为 MARCXML

    下面是需要处理的示例XML文件的前几行。。。

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
      <marc:record>
        <marc:leader>00925njm  22002777a 4500</marc:leader>
    

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <collection xmlns="http://www.loc.gov/MARC21/slim">
      <record>
        <leader>01142cam  2200301 a 4500</leader>
    

    要点:

    Regex xmlNamespace = new Regex("xmlns:(?<PREFIX>[^=]+)=\"(?<URI>[^\"]+)\"", RegexOptions.Compiled);
    
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(xmlRecord);
    XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);
    
    MatchCollection namespaces = xmlNamespace.Matches(xmlRecord);
    foreach (Match n in namespaces)
    {
        nsMgr.AddNamespace(n.Groups["PREFIX"].ToString(), n.Groups["URI"].ToString());
    }
    

    XPath调用如下所示。。。

    XmlNode leaderNode = xmlDoc.SelectSingleNode(".//" + LeaderNode, nsMgr);

    在哪里? LeaderNode 是一个可配置的值,并且将等于 "marc:leader" "leader" 在第二个例子中。

    XmlDocument .

    编辑:

    if (LeaderNode.Contains(":"))
    {
        string prefix = LeaderNode.Substring(0, LeaderNode.IndexOf(':'));
        XmlNode root = xmlDoc.FirstChild;
        string nameSpace = root.GetNamespaceOfPrefix(prefix);
        nsMgr.AddNamespace(prefix, nameSpace);
    }
    

    现在不再依赖Regex了!

    1 回复  |  直到 14 年前
        1
  •  2
  •   GrayWizardx    14 年前

    如果你 知道 文档中将有一个给定的元素(例如根元素),您可以尝试使用 GetNamespaceOfPrefix .