gpt4 book ai didi

asp.net - 非常困惑如何解析带有命名空间前缀的 xml

转载 作者:数据小太阳 更新时间:2023-10-29 02:27:32 25 4
gpt4 key购买 nike

因此,我需要能够解析可能包含命名空间前缀的 xml 文件。我已经尝试使用示例文件执行此操作,并且在尝试获取节点列表时它会返回 null,即使我指定的节点没有属性前缀也是如此。

我一直在尝试对此进行研究,但它不断回到这样一个事实,即如果没有定义命名空间前缀,它将无法工作,所以我添加了我认为可以做到这一点的代码,但它仍然给出了同样的结果。这是我添加的一些代码:

protected void Page_Load(object sender, EventArgs e)
{
xml.Load(Server.MapPath("~/SomeLesson/imsmanifest.xml"));
populateBaseNodes();
}

private void populateBaseNodes()
{
treeViewMenu.Nodes.Clear(); // Clear any existing items
TreeNode treenode = new TreeNode();
treenode.Text = "organizations";
XmlNodeList baseNodeList;

string xmlns = xml.DocumentElement.Attributes["xmlns"].Value;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("adlcp", "http://www.adlnet.org/xsd/adlcp_v1p3");
nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
nsmgr.AddNamespace("imscp", "http://www.w3.org/2001/XMLSchema-instance");
nsmgr.AddNamespace("imsss", "http://www.w3.org/2001/XMLSchema-instance");
nsmgr.AddNamespace("schemaLocation", "http://www.w3.org/2001/XMLSchema-instance");

baseNodeList = xml.SelectNodes("/manifest/organizations/organization/item", nsmgr);

TextBox1.Text = baseNodeList.Count.ToString();

foreach (XmlNode xmlnode in baseNodeList)
{
TreeNode treeNodeCatalog = new TreeNode();
treeNodeCatalog.Text = xmlnode.Attributes["identifier"].Value;
treeNodeCatalog.SelectAction = TreeNodeSelectAction.Expand;
treeViewMenu.Nodes.Add(treeNodeCatalog);
}

treeViewMenu.CollapseAll();
}

(marc_s) 下面是需要解析的 XML:

<manifest identifier="Navigating_in_QuickBooks_-_Introduction_MANIFEST" version="1.3"
xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3"
xmlns:imsss="http://www.imsglobal.org/xsd/imsss"
xsi:schemaLocation=" http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd
http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd
http://www.adlnet.org/xsd/adlcp_v1p3 adlcp_v1p3.xsd
http://www.adlnet.org/xsd/adlseq_v1p3 adlseq_v1p3.xsd
http://www.adlnet.org/xsd/adlnav_v1p3 adlnav_v1p3.xsd">

<metadata>
<!-- not relevant here ... -->
</metadata>
<organizations default="TOC1">
<organization identifier="TOC1">
<title>Navigating in QuickBooks - Introductory Lesson</title>
<item identifier="I_SCO0" identifierref="SCO0">
<title>Navigating in QuickBooks - Introductory Lesson</title>
</item>
</organization>
</organizations>
<resources>
<!-- not relevant here ... -->
</resources>
</manifest>

最佳答案

您没有向我们展示您的 XML 是什么样的 - 但有两条评论:

  1. 您不需要添加 xsi 前缀,我不确定 schemaLocation 前缀应该做什么......

  2. 当您定义架构前缀后,您当然还需要在您的 XPath 中使用这些前缀!

同样,由于不知道您的 XML 结构是什么样的,我无法真正说出您需要什么 - 但大致如下:

 baseNodeList = xml.SelectNodes("/adlcp:manifest/adlcp:organizations/adlcp:organization/imscp:item", nsmgr);

或您的源 XML 所需的任何其他 XML 命名空间前缀。

更新:查看您的 XML 会更清楚:查看根节点 - 它有一个默认 XML namespace (带有 xmlns="... ." 并且没有显式前缀):

<manifest identifier="Navigating_in_QuickBooks_-_Introduction_MANIFEST" version="1.3"
xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" <=== DEFAULT namespace!!!
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3"
xmlns:imsss="http://www.imsglobal.org/xsd/imsss"
................>

这意味着:所有没有特定 XML 前缀的后续节点将位于该默认命名空间中

不幸的是,.NET XML 解析在定义不带前缀的默认命名空间时会出现问题 - 所以我最好的解决方案是为默认命名空间创建一个带有前缀的命名空间,然后使用它:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);

// add default namespace, with a prefix for .NET
nsmgr.AddNamespace("ns", "http://www.imsglobal.org/xsd/imscp_v1p1");

baseNodeList =
xml.SelectNodes("/ns:manifest/ns:organizations/ns:organization/ns:item", nsmgr);

现在有结果了吗??

关于asp.net - 非常困惑如何解析带有命名空间前缀的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7957844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com