appendChild에서 추가한 원하지 않는(빈) xmlns 특성 제거
다음 코드가 있습니다.
function setupProject($projectFile) {
[xml]$root = Get-Content $projectFile;
$project = $root.Project;
$beforeBuild = $root.CreateElement("Target", "");
$beforeBuild.SetAttribute("name", "BeforeBuild");
$beforeBuild.RemoveAttribute("xmlns");
$project.AppendChild($beforeBuild);
$root.Save($projectFile);
}
새로 추가해야 합니다.<Target name="BeforeBuild" />
XML 문서로 이동합니다.
하지만 빈 공간도 추가됩니다.xmlns=""
내가 원하지 않는 속성.(사실 이 속성을 좋아하지 않는 것은 Visual Studio입니다!)
<Target name="BeforeBuild" xmlns="" />
나는 이미 이 코드를 시도했습니다.
$beforeBuild.RemoveAttribute("xmlns");
$project.AppendChild($beforeBuild);
$beforeBuild.RemoveAttribute("xmlns");
그xmlns=""
부모 요소가 네임스페이스에 있고 자식 요소가 없기 때문에 네임스페이스(un) 인증이 추가되었습니다.
이 네임스페이스 선언을 추가하지 않으려면 하위 요소를 상위 요소와 동일한 네임스페이스에 두고 요소를 생성할 때 이 네임스페이스에 배치해야 합니다.즉, 통화를 변경합니다.CreateElement("Target", "")
올바른 네임스페이스를 지정합니다.
Michael Kay가 대답했듯이 이 원치 않는 네임스페이스를 제거하는 가장 좋은 방법은 상위 네임스페이스와 동일한 네임스페이스에 새 자식 요소를 만드는 것입니다.
function setupProject($projectFile) {
[xml]$root = Get-Content $projectFile;
$project = $root.Project;
# UPDATE THIS LINE $beforeBuild = $root.CreateElement("Target", "");
$beforeBuild = $root.CreateElement("Target", $project.NamespaceURI);
$beforeBuild.SetAttribute("name", "BeforeBuild");
$beforeBuild.RemoveAttribute("xmlns");
$project.AppendChild($beforeBuild);
$root.Save($projectFile);
}
가능한 해결 방법은 다음과 같습니다.
다음은 OP에 효과가 있었던 두 번째 솔루션의 해결 방법입니다.
$content = [xml] $content.OuterXml.Replace(" xmlns=`"`"", "")
$content.Save($_.FullName);
Javascript 사용
JS를 사용하여 XML 문서를 만들고 선언한 후 하위 노드에서 빈 xmlns 특성을 가져오는 경우xmlns="XXXX"
상위 노드에서 JS 사용createElementNS(namespace, nodeName)
대신에createElement(nodeName)
.
이는 자식 노드가 부모 노드와 동일한 네임스페이스를 공유하도록 가정한 것입니다.아래의 경우 'v1', 'v2' 등은 'data'의 NS를 공유합니다.
다음과 같이 표시됩니다.
let data = someArray;
let nameSpace = 'XXX';
let doc = "<?xml version='1.0' encoding='utf-8' ?><data xmlns='XXXX'></data>";
let parser = new DOMParser();
let xml = parser.parseFromString(doc, "text/xml");
for (let i = 0; i < data.length; i++) {
let node = xml.createElementNS(nameSpace , "v" + (i + 1));
$(node).text(data[i]);
let elements = xml.getElementsByTagName("data");
elements[0].appendChild(node);
}
올바른 결과는 다음과 같습니다.
<?xml version='1.0' encoding='utf-8' ?>
<data xmlns='XXXX'>
<v1></v1>
<v2></v2>
</data>
BAD 결과 대비:
<?xml version='1.0' encoding='utf-8' ?>
<data xmlns='XXXX'>
<v1 xmlns=""></v1>
<v2 xmlns=""></v2>
</data>
이 솔루션을 사용하면 하위 노드에 대해 별도의 네임스페이스를 선언할 수도 있습니다.간단히 교체nameSpace
다른 네임스페이스 URI 문자열 또는 다른 집합 변수를 가진 변수입니다.
네임스페이스는 각 노드 이름의 고유한 부분입니다.네임스페이스를 제거하면 노드를 다시 만들어야 합니다.네임스페이스 속성 없이 하위 노드를 만들 수 있는 코드입니다.
즉, 기본 태그에 네임스페이스 속성이 포함되어 있고 자식 태그에는 포함되어 있지 않습니다.따라서 하위 노드는 부모에서 기본 네임스페이스 특성을 상속합니다.네임스페이스 특성을 제거하는 가장 좋은 방법은 다음과 같습니다.
[xml]$oXMLDocument = (Get-Content "D:\myXml.xml")
# Assuming Project is the parent node with a namespace
$project = $oXMLDocument.Project
$childNode = $oXMLDocument.CreateElement("test",$project.NamespaceURI)
# (Optional) Add any attributes to the element
$childNode.SetAttribute("name", "value")
$oXMLDocument.DocumentElement.AppendChild($childNode)
# Save the document
$oXMLDocument.Save("D:\myXml2.xml")
기본적으로 하위 노트에서 네임스페이스 특성은 제거되지 않습니다.그리고 사실 당신은 할 수 없습니다.속성을 기본값으로 숨깁니다.
하위 노드 아래에 하위 자식을 작성해야 하는 경우 동일한 스타일을 수행합니다.
저는 VBA에서 웹 사이트 맵을 만드는 데 문제가 있었지만 @Neolisk가 저를 올바른 방향으로 이끌었습니다.이것으로 문제가 해결되었습니다.
'replace the empty attribute with nothing and load it back into the XML source
myTree.LoadXML Replace(myTree.XML, " xmlns=""""", "")
'Write that XML to a file
myTree.Save xmlFileName
도와주셔서 감사합니다, @Neolisk!
네임스페이스는 각 노드 이름의 고유한 부분입니다.네임스페이스를 제거하면 노드를 다시 만들어야 합니다.네임스페이스 속성 없이 하위 노드를 만들 수 있는 코드입니다.
[xml]$oXmlDocume = [xml] (Get-Content D:\myXml.xml)
// Assuming Project is the parent node
$project = $oXMLDocument.Project
$childNode = $oXMLDocument.CreateElement("Child",$project.NamespaceURI)
$0XMLDocument.AppendChild($ChildNode)
하위 노드 아래에 하위 자식을 작성해야 하는 경우 동일한 스타일을 수행합니다.
언급URL : https://stackoverflow.com/questions/13220095/remove-unwanted-empty-xmlns-attribute-added-by-appendchild
'code' 카테고리의 다른 글
Json 데이터 유형이 mariadb에서 작동하지 않습니다. (0) | 2023.09.05 |
---|---|
Excel 2007으로 Office Automation을 하려고 하지만 Excel 2003을 계속 사용합니다. (0) | 2023.09.05 |
도커 엔트리 포인트와 쿠버네티스 컨테이너 사양 명령의 차이점은 무엇입니까? (0) | 2023.09.05 |
왜 tqdm 인쇄가 같은 라인을 업데이트하는 대신 새로운 라인으로 진행됩니까? (0) | 2023.09.05 |
Spring Boot REST API에서 시간 초과를 설정하는 방법은 무엇입니까? (0) | 2023.09.05 |